写了个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
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
internet上老丢包, 这个很正常, 距离远了丢包是肯定会发生的丢包与 closeSocket 没关系, internet上 每包的数据不要太大,
丢失的包可以再重发
-------------
应放在循环外,后面有那么多break;语句,容易产生资源泄漏。试着把等待时间调长,看看怎样?
为什么不清理?
你发的包文也不长啊,应该是响应时间的问题!