日期:2014-05-16  浏览次数:20865 次

udp socket通讯,recvfrom()一直返回-1,perror提示"recvfrom: Bad address"
本人在设备中两个进程间socket通讯,udp方式,相同IP不同端口号.其中一个进程向另一个进程发送数据后,接收对方响应数据,recvfrom()一直返回-1,perror提示 "recvfrom:   Bad   address ",但是接收到的响应数据又是对的,不知道错在哪里?代码如下.另一个进程工作正常.

        ...
        myTagType   tag;//256   bytes
        int   tsresponse_sock;
        struct   sockaddr_in   TSResponse;//local   IP
        struct   sockaddr_in   source_resp;//dest   IP
        int   command_port   =   3200;             //udp   control   port;
        int   on   =   1;

        ...
        bzero(&TSResponse,   sizeof(TSResponse));
        TSResponse.sin_family   =   AF_INET;
        TSResponse.sin_addr.s_addr   =   htonl(INADDR_ANY);
        TSResponse.sin_port   =   htons(command_port+1);
        tsresponse_sock   =   socket(AF_INET,   SOCK_DGRAM,   0);
        setsockopt(tsresponse_sock,   SOL_SOCKET,   SO_REUSEADDR,   (const   char   *)&on,   sizeof(on));
        bind(tsresponse_sock,   (struct   sockaddr   *)&TSResponse,   sizeof(struct   sockaddr_in));

        bzero(&source_resp,   sizeof(source_resp));
        source_resp.sin_family   =   AF_INET;
        source_resp.sin_addr.s_addr   =   local_ipaddr;
        source_resp.sin_port   =   htons(command_port);

        ....
          sendto(tsresponse_sock,   &tag,   20,   0,   (struct   sockaddr   *)&source_resp,   sizeof(struct   sockaddr_in));
          ....
        timeout.tv_sec=3;
        ret   =   select(tsresponse_sock+1,   &fdread,   NULL,&fdexcept,   &timeout);
        ....
        else   if   (FD_ISSET(tsresponse_sock,&fdread))   {
        {
              bzero   (&tag,   sizeof   (tag));
              nsize   =   recvfrom(tsresponse_sock,   &tag,   sizeof(tag),   0,   (struct   sockaddr   *)&source_resp,   sizeof(struct   sockaddr_in));
              printf( "recv   nsize   =   %d\n ",nsize);
              if(nsize   ==   -1)   perror( "recvfrom ");
              ....
          }
          ...

------解决方案--------------------
recvfrom最后一个参数是socklen_t *, 你用的是socklen_t
------解决方案--------------------
recvfrom最后一个参数是int *,而你是int

int addr_len =sizeof(struct sockaddr_in);

nsize = recvfrom(tsresponse_sock,&tag,