gpt4 book ai didi

c++ - Winsock 发送附加数据

转载 作者:行者123 更新时间:2023-11-30 04:29:57 27 4
gpt4 key购买 nike

我正在用 c++ 和 winsock 编写一个小型客户端/服务器应用程序,我无法解释正在发生的一些事情。我写了 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;
}

服务器发出一个整数,其中包含将跟随它的数据 block 的大小。在我的例子中,数据 block 的大小不应该改变,它应该总是 92600 字节,但有时客户端会收到 92604字节代替。奇怪的是,如果我在发送 block 大小和 block 本身(带 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 不发送额外的数据,你发送。

关于c++ - Winsock 发送附加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9012091/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com