最近刚学winsock编程。一边看孙鑫的书一边用VC做了个最简单的聊天程序,今晚调试时遇到这么一个问题。
现象:当通信中的一端关闭后(直接关闭窗口),另一端会不断地重复受到最后一次受到的信息。
我把断点设到recv后(1处),没想到连接断后recv能不断地受到正值,而且超大无比16777215。
第一反应是遇上了winsock的诡异BUG,可是把断点正好设到recv()上(2处),却又发现明明返回了 -1!
代码如下 char buff[20];
int num = recv(sockConn,buff,19,0);        //2       
buff[num] = '\0';
if (num <0)                                //1
{
int err = WSAGetLastError();
if (err == WSAECONNRESET)
MessageBox(NULL,"那头已经断了","线路已断",MB_ICONSTOP);
else原来是编译器把 int num 的空间正好分配到了 char buff[20]前面,
当num返回-1时,正好把32有符号数的高8位清零了,于是num 成了 0x00ffffff。
仔细想想是自己不该在未判断num的前提下就加'\0'另外想问一下,MFC中如何获得本机的IP呢?每次自己输入很麻烦啊。

解决方案 »

  1.   

    BOOL GetIPinfo(char *pIPinfo,LPDWORD lpdwlength)
    {
    PIP_ADAPTER_INFO pAdapterInfo; 
    PIP_ADAPTER_INFO pAdapter = NULL; 
    DWORD dwRetVal = 0; 
    ULONG ulOutBufLen; 
    pAdapterInfo=(PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO)); 
    ulOutBufLen = sizeof(IP_ADAPTER_INFO);
    // 第一次调用GetAdapterInfo获取ulOutBufLen大小 
    if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) 

    free(pAdapterInfo); 
    pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen); 
    }
    if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR) 

    pAdapter = pAdapterInfo;
    if (pAdapter)
    {
    memcpy(pIPinfo,pAdapter->IpAddressList.IpAddress.String,strlen(pAdapter->IpAddressList.IpAddress.String));
    strncat(pIPinfo,"\n",1);
    strncat(pIPinfo,pAdapter->IpAddressList.IpMask.String,strlen(pAdapter->IpAddressList.IpMask.String));
    strncat(pIPinfo,"\n",1);
    strncat(pIPinfo,pAdapter->GatewayList.IpAddress.String,strlen(pAdapter->GatewayList.IpAddress.String));
    }

    else 

    printf("Call to GetAdaptersInfo failed.\n"); 

    return TRUE;
    }
      

  2.   

    void print_all_ip(void)
    {
      char szHostName[128];
      const char* pszAddr;
      struct hostent * pHost;
      int i,j; 
      if( gethostname(szHostName, 128) == 0 )
      {
        pHost = gethostbyname(szHostName); 
        for( i = 0; pHost!= NULL && pHost->h_addr_list[i]!= NULL; i++ ) 
        {  /*对每一个IP地址进行处理*/
          pszAddr=inet_ntoa (*(struct in_addr *)pHost->h_addr_list[i]);
          printf("%s\n",pszAddr);/*打印*/
        }
      }
    }
      

  3.   

    你要看你另外一端发送数据的长度,如果超过你的buffer的容量,你会多次接收数据到数据的,毕竟你是在调试状态中,对方也发送成功,到了你这边socket的系统缓冲区中的,由你来不断的获取出来,
      

  4.   

     buff[num] = '\0';//if (num <0)
     if (num <0)