原始套接字 怎么获取客户端的通信端口号》?
时间:2010-09-02
来源:互联网
用原始套接字的服务器端源代码如下
复制代码
以上代码会出现这个错误:recvfrom中收到的客户端的地址信息addr中的端口号了0。
改成非原始套接字能够得到正确的端口。
这是为什么?
- int main(int argc,char *argv[])
- {
- int mysock,len; /*定义相关的变量。*/
- struct sockaddr_in addr;
- struct in_addr local;
- int i=0;
- char msg[256]; /*定义一个数组,保存发送与接收的信息。*/
- int addr_len;
- if (( mysock= socket(AF_INET, SOCK_RAW, IPPROTO_UDP))<0)/*建立一个连接。*/
- //if((mysock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)) < 0)
- {
- perror("error"); /*输出错误。*/
- exit(1);
- }
- printf("socket created .\n");
- printf("socked id: %d \n",mysock);
-
- inet_aton("127.0.0.1",&local);
- addr.sin_family=AF_INET; /*填充地址结构体。*/
- addr.sin_port=htons(LOCALPORT);
- addr.sin_addr.s_addr=local.s_addr;
- bzero(&(addr.sin_zero),8);
-
- if(bind(mysock,(struct sockaddr*)&addr,sizeof(addr))<0) /*在 socket 上面绑定端口号与 IP。*/
- {
- perror("connect"); /*输出错误信息。*/
- exit(1);
- }
- printf("bind ok.\n"); /*绑定成功则输出信息。*/
- printf("local port :%d \n",LOCALPORT);
-
- IP_HEADER *pip = (IP_HEADER*)malloc(sizeof(IP_HEADER));
- UDP_HEADER *pudp = (UDP_HEADER*)malloc(sizeof(UDP_HEADER));
- while (1) /*进入一个循环。*/
- {
- /*清空 msg 所在的内存。*/
- bzero(msg,sizeof(msg));
- addr_len = sizeof(addr);
- memset(&addr,0,addr_len);
- len = recvfrom(mysock,msg,sizeof(msg),0,(struct sockaddr*)&addr,&addr_len);
- /*接收到信息。*/
- }
- }
改成非原始套接字能够得到正确的端口。
这是为什么?
作者: whyliyi 发布时间: 2010-09-02
http://hi.baidu.com/linux_kernel ... 51ae36aec3ab2f.html
可能对你启些提示
可能对你启些提示
作者: 0vk0 发布时间: 2010-09-02
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28