Winsock发送额外的数据
Winsock sends additional data
我正在用winsock用c++编写一个小型客户端/服务器应用程序,我无法解释正在发生的一些事情。。我写了两个基本函数,通过TCP连接发送/接收所有数据。。
bool sending(SOCKET source, char* buff, int size, int flags = 0)
{
int sent = 0;
int totalst = 0;
int total = size;
while(totalst != total)
{
sent = send(source, buff+totalst, size-totalst, flags);
if(sent > 0)
{
totalst += sent;
}
if(sent == SOCKET_ERROR)
{
return false;
}
}
return true;
}
bool receive(SOCKET source, char* buff, int size, int flags = 0)
{
int rec = 0;
int totalrc = 0;
int total = size;
while(totalrc != total)
{
rec = recv(source, buff+totalrc, size-totalrc, flags);
if(rec > 0)
{
totalrc += rec;
}
if(rec == SOCKET_ERROR)
{
return false;
}
}
return true;
}
服务器发送一个整数,其中包含后面的数据块的大小。在我的情况下,数据块的这个大小不应该改变,它应该总是92600字节,但有时客户端会接收92604字节。奇怪的是,如果我让服务器在发送块大小和块本身(使用Sleep)后等待,它总是发送我期望的内容。。
int i=0;
while(i < 100)
{
i++;
dat = getData();
len = sizeof(dat);
sending(source, (char*)&len, sizeof(len));
sending(source, dat, len);
Sleep(200);
}
客户端是否会因为滞后而接收到错误的字节值?有什么办法解决这个问题吗?感谢您的帮助!
考虑这个例子:
char *x = "!";
send(socket, x, 1); // destination, buffer, size
send(socket, x, 1);
send(socket, x, 1);
send(socket, x, 1);
你预计这里会发生什么?
char buffer[4];
recv(socket, buffer, 4); // source, buffer, size
在实践中,四个send
发送的数据可以被接收到一个recv
中。您不能保证,如果您对send
进行n
调用,您将对recv
进行n
调用以接收所有数据。
正如nos所评论的,TCP不实现消息边界。这是你的工作,在应用层。Winsock不发送额外的数据,你发送。
您的发送和接收函数都有一个错误。
您可以正确地跟踪发送/接收的总字节数,以便正确地退出循环,但在随后的send/recv调用中忘记了调整"buff"answers"size"的值。如果要发送的缓冲区必须通过多个要发送的调用进行传输,则会发送错误的数据。
同样,如果需要多次调用"recv",您将覆盖在缓冲区开头复制的数据。
它应该是:
sent = send(source, buff+totalst, size-totalst, 0);
同样,对于recv情况:
rec = recv(source, buff + totalrc, size-totalrc, 0);
我不确定这是否是你的问题的原因,但我有一种感觉,当todda指出的场景是真的时,你的数据流就会被这个错误破坏。
有道理吗?此外,您应该准备好处理recv()将返回0的情况。
我希望这能有所帮助。
相关文章:
- Winsock 数据不是从 IP 检索的,而是从普通 URL 检索的
- 如何通过TCP/IP Winsock发送双型数据
- Winsock 从服务器接收乱码数据
- Winsock:从套接字中删除数据
- Winsock recv() 返回不正确的数据
- 如何使用 winsock (c++) 发送recv 非字符数据
- recv (Winsock) 函数挂起,但数据可用
- C++ 绕道 Winsock recv 挂钩 - 自定义数据包
- C++ WinSock Recv 在接收 0 数据时终止线程而不是返回错误代码
- C++TCP Winsock服务器多次接收相同的数据包
- Winsock正在接收额外的数据
- 未在客户端Winsock中接收到完整数据
- Winsock发送空数据
- 为什么我在使用 winsock 时没有收到 UDP 数据包?
- Winsock C++发送数据时出现问题
- C++服务器无法从客户端/Winsock 接收数据
- Windows/Winsock UDP 数据包正在分组在一起
- C++Winsock将冻结接收数据
- 在C++winsock中通过TCP发送大数据(如文件)
- Winsock发送额外的数据