gpt4 book ai didi

sockets - TCP 发送/接收错误报告

转载 作者:可可西里 更新时间:2023-11-01 02:49:54 25 4
gpt4 key购买 nike

我有一个通过 TCP 通信的客户端/服务器程序(Windows,winsock2)。客户端一次以 8K 连接并向服务器发送数据(使用发送)。服务器只是读取数据(使用 recv)。

没有对套接字进行特殊设置。

问题:当通信过程中出现网络错误(例如电缆被拔出)时,接收方此时无法成功发送数据。为了简化,客户端在 10 次发送调用中发送了 80K 数据。 (所有发送成功)。由于某些网络问题,第 11 次发送失败。此后不再发送数据。

问题是在接收端,并不是所有的 80K 数据都被接收到。它始终小于 80K。

我希望作为发送方成功发送 80K,TCP 将保证将大量数据传送到目标 TCP(数据可能尚未被应用程序接收,但它在目标 TCP 缓冲区中)。

我错过了什么吗?

谢谢

编辑:

示例代码

服务器/接收器

/* create socket */
/* listen */
/* accept connection */
char recvbuf[8192];
do {

iResult = recv(ClientSocket, recvbuf, sizeof(recvbuf), 0);
if (iResult > 0) {
total += iResult;
printf("Total bytes received: %d\n", total);
}
else if (iResult == 0) {
printf("Connection is closing...\n");
break;
}
else {
printf("recv failed: %d\n", WSAGetLastError());
break;
}

} while (iResult > 0);

客户/发件人:

/* create socket */
/* connect to server */
char sendbuf[8192];

do {
// Send an initial buffer
iResult = send( ConnectSocket, sendbuf, sizeof(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
break;
}
total += iResult;
printf("Total bytes Sent: %ld\n", total);
} while(iResult > 0);
//wait before cleaning up
getc(stdin);

最佳答案

你的假设是有缺陷的。

send() 成功返回仅意味着数据已被您的内核接受发送 - 它可能仍位于您的发送队列中。

如果你想知道数据是否到达了另一端,你必须在应用程序级别的确认中。

(另见 this question)

关于sockets - TCP 发送/接收错误报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1886167/

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