+ -
当前位置:首页 → 问答吧 → 原始套接字 怎么获取客户端的通信端口号》?

原始套接字 怎么获取客户端的通信端口号》?

时间:2010-09-02

来源:互联网

用原始套接字的服务器端源代码如下
  1. int main(int argc,char *argv[])
  2. {
  3.         int mysock,len;                     /*定义相关的变量。*/
  4.         struct sockaddr_in addr;
  5.         struct in_addr local;
  6.         int i=0;
  7.         char msg[256];                      /*定义一个数组,保存发送与接收的信息。*/
  8.         int addr_len;
  9.         if (( mysock= socket(AF_INET, SOCK_RAW, IPPROTO_UDP))<0)/*建立一个连接。*/  
  10.         //if((mysock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)) < 0)                     
  11.         {
  12.                 perror("error");                /*输出错误。*/
  13.                 exit(1);
  14.         }
  15.         printf("socket created .\n");
  16.         printf("socked id: %d \n",mysock);
  17.        
  18.         inet_aton("127.0.0.1",&local);
  19.         addr.sin_family=AF_INET;                /*填充地址结构体。*/
  20.         addr.sin_port=htons(LOCALPORT);
  21.         addr.sin_addr.s_addr=local.s_addr;
  22.         bzero(&(addr.sin_zero),8);
  23.        
  24.         if(bind(mysock,(struct sockaddr*)&addr,sizeof(addr))<0) /*在 socket 上面绑定端口号与 IP。*/
  25.         {
  26.                 perror("connect");                  /*输出错误信息。*/
  27.                 exit(1);
  28.         }
  29.         printf("bind ok.\n");              /*绑定成功则输出信息。*/
  30.         printf("local port :%d \n",LOCALPORT);
  31.        
  32.         IP_HEADER *pip = (IP_HEADER*)malloc(sizeof(IP_HEADER));
  33.         UDP_HEADER *pudp = (UDP_HEADER*)malloc(sizeof(UDP_HEADER));
  34.         while (1)                               /*进入一个循环。*/
  35.         {
  36.                                             /*清空 msg 所在的内存。*/
  37.                 bzero(msg,sizeof(msg));
  38.                 addr_len = sizeof(addr);
  39.                 memset(&addr,0,addr_len);
  40.                 len = recvfrom(mysock,msg,sizeof(msg),0,(struct sockaddr*)&addr,&addr_len);
  41.                                                         /*接收到信息。*/
  42.        }
复制代码
以上代码会出现这个错误:recvfrom中收到的客户端的地址信息addr中的端口号了0。
改成非原始套接字能够得到正确的端口。
这是为什么?

作者: whyliyi   发布时间: 2010-09-02

http://hi.baidu.com/linux_kernel ... 51ae36aec3ab2f.html

可能对你启些提示

作者: 0vk0   发布时间: 2010-09-02

相关阅读 更多

热门下载

更多