绑定vlan,网卡的demon,如果有多个网卡,多个vlan,网卡的ip设置成一致,那就不能只简单绑定ip来创建socket,
需要绑定网卡设备
客户端udp_client.c
#include
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include #define BUF_SIZE 1024 #define INTERFAXENAME"mgbe3_0.14"int sock; int main(int argc, char *argv[]) { int ret = 0; char buf[1024]; memset(buf,1,1024); if ( (sock=socket(AF_INET, SOCK_DGRAM, 0)) <0) { perror("socket"); exit(1); } struct ifreq interface; strncpy(interface.ifr_ifrn.ifrn_name, INTERFAXENAME, sizeof(INTERFAXENAME)); if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)) < 0) // 绑定vlan网卡设备 { perror("SO_BINDTODEVICE failed"); } struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(31004); addr.sin_addr.s_addr = inet_addr("198.18.36.3"); ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)); if (ret < 0) { printf("%s: bind 198.18.36.3 failed\n", __FUNCTION__); close(sock); return 0; } else printf("bind 198.18.36.3 success \r\n"); struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(31004); server_addr.sin_addr.s_addr = inet_addr("198.18.36.1"); while(1) { ret = sendto(sock, buf, 1024, 0,(struct sockaddr *)&server_addr, sizeof(server_addr)); printf("sendto 198.18.36.1 ret:%d\n", ret); usleep(200000); } close(sock); return 0; } 服务端udp_service.c
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include #define BUF_SIZE 1024 #define INTERFAXENAME"mgbe3_0.14"int sock; int main(int argc, char *argv[]) { int ret = 0; char buf[1024]; memset(buf,1,1024); if ( (sock=socket(AF_INET, SOCK_DGRAM, 0)) <0) { perror("socket"); exit(1); } struct ifreq interface; strncpy(interface.ifr_ifrn.ifrn_name, INTERFAXENAME, sizeof(INTERFAXENAME)); if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)) < 0) // 绑定vlan网卡设备 { perror("SO_BINDTODEVICE failed"); } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(31004); server_addr.sin_addr.s_addr = inet_addr("198.16.37.4"); ret = bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (ret < 0) { printf("%s: bind 198.16.37.4 failed\n", __FUNCTION__); close(sock); return 0; } else printf("bind 198.16.37.4 success \r\n"); struct sockaddr_in client_addr; socklen_t len; len = sizeof(client_addr); while(1) { ret = recvfrom(sock, buf, 1024, 0,(struct sockaddr *)&client_addr, &len); printf("recvfrom 198.16.37.3 ret:%d\n", ret); } close(sock); return 0; } 将两个程序编译成二进制执行程序,放到开发板运行,就行测试。