TCP SOCKET以一种STREM的形式传输数据,在传输并没有固定的大小和边界,这就要求在应用层解决数据的边界问题。
在这里以长度+内容的方式确定消息的边界,而在接收数据,只是简单的以最大的能力RECEIVE就可以。而发送数据有可能整个消息发不完,这样就要一直发,直到完成。
这里用的是MFC的SOCKET blocking model.
void CConnectSocket::OnReceive(int nErrorCode) { int size = 0; size = Receive(m_buffer+m_pos,RECV_BUFFER-m_pos); if(size>0) { m_pos += size; } else { CloseSocket(); } while(m_pos>=4) { int len = 0; memcpy(&len,m_buffer,4); if(len<=m_pos) { m_sink.NotifyReceived((NETMSG*)m_buffer,ID()); memcpy(m_buffer,m_buffer+len,m_pos-len); m_pos=m_pos-len; } } CSocket::OnReceive(nErrorCode); }
BOOL CConnectSocket::SendBinary(char* buffer,int len) { int sentsize = 0; int needsize = len; while(needsize > 0) { sentsize = Send(buffer+sentsize,needsize); if(sentsize == SOCKET_ERROR) { CloseSocket(); return FALSE; } else { needsize = needsize - sentsize; } } return TRUE; }