send()如何保证已发送完毕?
我想在客户端退出的时候给服务器发消息,准备调用两次send(),然后调用WSACleanup(),但是据我测试,服务器还没收到就已经触发了客户端的WSACleanup()事件。
看:
- C/C++ code
void CChatDlg::OnExitRoom(){ send(g_ClientSocket, (char*)&head, sizeof(head), 0); send(g_ClientSocket, theApp.m_strUserName.GetBuffer(0), head.m_StrLen, 0); WSACleanup();}
暂时有两个应对办法
第1:使用Sleep(100),缺点,粗糙,但起作用
第2:抄袭MFC的CSocket::Send()函数:
- C/C++ code
int CChatDlg::mySend(SOCKET socket, const void* lpBuf, int nBufLen, int nFlags){ char* pBuf = (char*)lpBuf; int nLeft = nBufLen; int nWritten = 0; while (nLeft > 0) { nWritten = send(socket, pBuf, nLeft, nFlags); if (nWritten == SOCKET_ERROR) { return nWritten; } nLeft -= nWritten; pBuf += nWritten; } return nBufLen - nLeft;}
但是不起作用,似乎这不是根本问题。
怎么保证这两个send()已经发送完毕?
如果要调用10个send()呢?
一般的做法是什么??
[解决办法]
send 只是将数据发送到系统级别的发送缓冲区
1.如果最后发送的数据包,对你的程序逻辑比较重要的话,你可以等待服务器给你一个回应的确认,如果等待超时或者发送缓冲区溢出,你可以组织重复处理
2.如果最后数据不重要,服务器端处理断开网络事件的后续就可以了
[解决办法]
所以我说你等待服务器一定的时间,让服务器给你回应退出啊,如果超时再继续做处理
[解决办法]
记得可以用setsockopt接口设置退出时等待数据发送完成
你可以查查这个接口的帮助