写了个c/s传输文件,局域网没问题,在
internet上老丢包,搜索是closeSocket硬
关闭的问题,真正的关闭是下面这个函数,里面有些问题很不懂,请高手解答<<<<3ks>>>>>>void CloseSocket(SOCKET hSocket)
{
    if(hSocket == INVALID_SOCKET)
        return;
    
    WSAEVENT hEvent = WSA_INVALID_EVENT; 
    
    for(;;)
    {
        hEvent = WSACreateEvent();  //这个事件要在循环里?
        if(hEvent == WSA_INVALID_EVENT) 
            break;        if(WSAEventSelect(hSocket, hEvent, FD_CLOSE) != 0)
        //select能接受? 
        break;        if(shutdown(hSocket, SD_SEND) != 0) 
        break;        if(WaitForSingleObject(hEvent, 200) != WAIT_OBJECT_0)
            break;        char buf[1024];
        int nRecv = 0;
        do
        {
            nRecv = recv(hSocket, buf, 1024, 0);  //接收的是什么?
        } while (!(nRecv == 0 || nRecv == SOCKET_ERROR));        break;
    }    if (hEvent != WSA_INVALID_EVENT) 
    {
        WSACloseEvent(hEvent); 
        hEvent = WSA_INVALID_EVENT; 
    }
    
    closesocket(hSocket);
}
===================================================
xiexie

解决方案 »

  1.   

    写了个c/s传输文件,局域网没问题,在internet上老丢包, 
    internet上老丢包, 这个很正常, 距离远了丢包是肯定会发生的丢包与 closeSocket 没关系, internet上 每包的数据不要太大, 
    丢失的包可以再重发
      

  2.   

    hEvent = WSACreateEvent(); //这个事件要在循环里?
    -------------
    应放在循环外,后面有那么多break;语句,容易产生资源泄漏。试着把等待时间调长,看看怎样?
      

  3.   

    这么多break!
    为什么不清理?
    你发的包文也不长啊,应该是响应时间的问题!
      

  4.   

    http://blog.csdn.net/wang921718/archive/2007/09/04/1772396.aspx看看这里我的BLOG,希望对你能有帮助!