首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

send()怎么保证已发送完毕

2012-03-16 
send()如何保证已发送完毕?我想在客户端退出的时候给服务器发消息,准备调用两次send(),然后调用WSACleanup

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接口设置退出时等待数据发送完成
你可以查查这个接口的帮助

热点排行