【发布时间】:2012-02-19 04:34:32
【问题描述】:
我正在用 Winsock 用 C++ 编写一个小型客户端/服务器应用程序,但我无法解释正在发生的一些事情。 我编写了 2 个通过 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字节代替。奇怪的是,如果我在发送块大小和块本身(带睡眠)后让服务器等待,它总是会发送我所期望的..
int i=0;
while(i < 100)
{
i++;
dat = getData();
len = sizeof(dat);
sending(source, (char*)&len, sizeof(len));
sending(source, dat, len);
Sleep(200);
}
客户端会因为延迟而接收到不正确的字节值吗? 有没有办法解决这个问题? 任何帮助表示赞赏!
【问题讨论】:
-
您已经接受了一个答案。但是我刚刚指出了您代码中的两个错误,这些错误可能与您所看到的内容有关,因为 todda 正在谈论什么。请参阅下面的答案。
-
谢谢!是的,没有人已经在评论中指出了这一点,但他很快就把它删除了。我只是忘记更新我的问题了。
标签: c++ sockets client-server winsock send