你说你有一个 TCP 协议,你所拥有的不是一个协议,它只是一个 TCP 连接。
为了实现一个协议,您需要发送更多信息,recv() 部分应该(必须)知道将要接收什么。
您需要在缓冲区长度之前发送缓冲区或在缓冲区末尾发送终止字符,这不应该是已发送消息的其余部分的一部分。Line-Feed (10)、Carriage-Return (13) 和 Form-Feed (12) 等字符都是不错的选择。
如果您决定使用终止字符,那么您应该一次读取 (recv) 一个字符,验证这是否是终止指示符。终止字符仅在发送表示文字的字符串时有用,不指示用于发送文件或图像或二进制字符串。
我已经修改了实现缓冲区指示器方法长度的例程:
bool Socket::Sender(char* msg){
// Send a string with the length (int) of it ahead
int len = strlen(msg);
int hLen = htonl(len); // put it in network byte order
if (send(sockfd, (char *) &hLen, sizeof(int), 0) == sizeof(int) &&
send(sockfd, msg, len, 0) == len)
{
return true;
}
Close();
return false;
}
int Socket::Receive(char* msg, int maxlen){
int recvResult;
int len;
int offset;
// receive a string with the length (int) of it first
if (recv(sockfd, (char *) &len, sizeof(int), 0) == sizeof(int))
{
len=ntohl(len); // put in host byte order
// Check there is enough space
if (len > maxlen)
{
// the receive chars is bigger than maxlen,
// either receive as many as maxlen or return error
len=maxlen;
// Close();
// return -1;
}
offset=0;
// loop until len chars are received, no more no less
while (offset < len)
{
recvResult = recv(sockfd, (char *) &msg[offset], len-offset, 0);
if (recvResult <= 0)
{
Close();
return -1;
}
offset +=recvResult;
}
// Succeeded, return len
return len;
}
Close();
return -1;
}