socket 指定网口收发数据
来源:互联网 发布:常用的数据采集方法 编辑:程序博客网 时间:2024/05/22 14:01
在系统中,可能会有多片网口,工作在不同的网段,同时有不同的网关,socket需要绑定其中的一个网卡,进行网络的通信。
设置socket指定为eth1进行收发网络包:
#define INTERFAXENAME "eth1" struct ifreq interface; strncpy(interface.ifr_ifrn.ifrn_name, INTERFAXENAME, sizeof(INTERFAXENAME)); if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface, sizeof(interface)) < 0) { perror("SO_BINDTODEVICE failed"); }demo程序如下:
#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <pthread.h>#include <netinet/in.h>#include <net/if.h>#include <linux/sockios.h>#include <sys/ioctl.h>#define BUF_SIZE 1024#define INTERFAXENAME "eth1"int sock;void * network_recv_thread(void * arg){ int n = 0; char buff[BUF_SIZE]; struct sockaddr_in peer; int len = sizeof(peer); while(1) { n = recvfrom(sock, buff, BUF_SIZE, 0, (struct sockaddr *)&peer, &len); if (n>0) { buff[n] = 0; printf("received:"); puts(buff); } else if (n==0) { printf("server closed\n"); close(sock); break; } else if (n == -1) { perror("recvfrom"); close(sock); break; } } return NULL;}int main(int argc, char *argv[]){ int ret = 0; if (argc != 3) { printf("Usage: %s ip port\n", argv[0]); exit(1); } printf("This is a UDP client\n"); 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) { perror("SO_BINDTODEVICE failed"); } struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argv[2])); addr.sin_addr.s_addr = inet_addr(argv[1]); if (addr.sin_addr.s_addr == INADDR_NONE) { printf("Incorrect ip address!"); close(sock); exit(1); } pthread_t pid; ret = pthread_create(&pid, NULL,network_recv_thread, NULL); if (ret) { printf("Create pthread error!\n"); return 0; } char buff[BUF_SIZE]; int n = 0; while (1) { gets(buff); n = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *)&addr, sizeof(addr)); if (n < 0) { perror("sendto"); close(sock); break; } } pthread_join(pid, NULL); return 0;}网络调试助手:
http://download.csdn.net/detail/ternence_hsu/9811625
0 0
- socket 指定网口收发数据
- socket收发数据
- Socket收发数据
- Socket收发数据
- SOCKET收发数据报
- SOCKET收发数据问题
- Socket收发数据浅析
- socket收发数据
- 异步收发数据socket实战
- socket通过多网卡收发数据
- BSD Socket的收发数据函数介绍
- 关于socket大数据收发解决方案
- Socket使用Udp广播收发数据
- Android笔记:Socket客户端收发数据
- vb2008 socket简单数据收发
- Android笔记:Socket客户端收发数据
- PHP中向socket服务器收发数据
- socket收发
- Tomcat日志log(转载)
- activity流程数据除脏
- 使用github搭建个人仓库
- spark2.x读取csv格式文件
- Java多线程学习(吐血超详细总结)
- socket 指定网口收发数据
- CloseHandle(),TerminateThread(),ExitThread()的区别
- Eclipse中背景颜色调节
- 脚本错误:对象不支持“getLabel”属性或方法
- 原型继承总结
- UVALive5964 LCM Extreme && UVA11426 GCD
- 如何删除MyEclipse通过Project Facets添加的Facet
- 欢迎使用CSDN-markdown编辑器
- Unity中的协同程序