我在linux上运行一个项目(ubuntu 13.10),它使用原始套接字连接到设备.
这是我的代码:
/* builed socket */
if ((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
perror("listener: socket");
return -1;
}
/* Set interface to promiscuous mode */
strncpy(ifopts.ifr_name, ifName, IFNAMSIZ-1);
ioctl(sockfd, SIOCGIFFLAGS, &ifopts);
ifopts.ifr_flags |= IFF_PROMISC;
ioctl(sockfd, SIOCSIFFLAGS, &ifopts);
/* Allow the socket to be reused - incase connection is closed prematurely */
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof sockopt) == -1) {
perror("setsockopt");
close(sockfd);
return -2;
}
Run Code Online (Sandbox Code Playgroud)
但是我的计算机上有2块NIC卡,我只想听其中一张.让我们说道德.我发现两个选项bind和SO_BINDTODEVICE如下:
/* option 1. Bind to device */
if (setsockopt(sockfd, SOL_SOCKET, …Run Code Online (Sandbox Code Playgroud) 我有一个类似于
sendto函数设置“网络无法访问”的问题,errno
和(不太像)UDP广播sendto失败:Linux 2.6.30上的“网络无法访问”,但是由于此问题未得到回答并且很老,我尝试过在此重新说明它们,以期得到答案。
我有一个UDP服务器和客户端,客户端在其中广播活动消息,服务器捕获它们(代码如下)。当我在ubuntu14.04、16.04,fedora6等几个不同的台式机linux上运行它们时,它们工作正常。但是,当我尝试从mpib8308板上的ltib嵌入式Linux运行它们时,服务器正常工作(从其他计算机接收消息),但客户端将errno设置为“网络不可访问”,因为它调用sendto。
我尝试了wireshark,但客户端没有板载接口上的数据包,并且我在板上使用tcpdump测试了系统,并且那里没有生成的数据包。
这是客户端的代码:
int clientSocket, portNum, nBytes;
char buffer[1024];
struct sockaddr_in serverAddr;
socklen_t addr_size;
/*Create UDP socket*/
clientSocket = socket(AF_INET, SOCK_DGRAM, 0);
int broadcastEnable=1;
int retsockopts=setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable));
/*Configure settings in address struct*/
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(12021);
serverAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
/*Initialize size variable to be used later on*/
addr_size = sizeof serverAddr;
while(1){
sprintf(buffer,"I AM ALIVE");
nBytes = strlen(buffer) + 1;
int err;
err …Run Code Online (Sandbox Code Playgroud)