gpt4 book ai didi

c - 套接字接收不能进入 for 循环

转载 作者:行者123 更新时间:2023-11-30 20:53:23 25 4
gpt4 key购买 nike

我想以 32 位 block 的形式发送 1GB 数据,因此在 for 循环中我正在执行 send(client_sock, buffer, tinfo->bufferSize, 0); 这很好。但在那之后,我收到了在第一次迭代后抛出错误(如下)的响应。如果我将 recv 放在 for 循环 的外面,那么它就可以正常工作。但那样我将无法确保每个 block 是否正确发送。

我的问题是

  1. 当我们可以迭代
    时,为什么我们不能迭代receive发送
  2. 可以将接收保持在 for 之外吗?不用担心关于是否每条消息都已发送?

注意- 无法使用外部库,它是大学的 POC 项目。 '通过套接字以 32 位 block 发送 1 Gb 数据'

void *tcpClient(void *arg) {
struct thread_info * tinfo = (struct thread_info *)arg;
char * buffer = (char *)malloc(sizeof(char)*(tinfo->bufferSize));
memset(buffer, 'a', sizeof(char)*(tinfo->bufferSize));

int client_sock = socket(AF_INET, SOCK_STREAM, 0);
connect(client_sock, (struct sockaddr *)&(tinfo->server_addr), sizeof(struct sockaddr));

long noOfChunks = oneGb/ tinfo->bufferSize;
for (int j = 0; j < noOfChunks; ++j) {
int totalBytesRcvd = 0;
int bytesRcvd = 0;
send(client_sock, buffer, tinfo->bufferSize, 0);
while (totalBytesRcvd < tinfo->bufferSize)
{
if ((bytesRcvd = recv(client_sock, buffer, tinfo->bufferSize, 0)) <= 0)
error("recv() failed or connection closed prematurely");
totalBytesRcvd += bytesRcvd; /* Keep tally of total bytes */

}
printf(buffer); /* Print the echo buffer */
}

free(buffer);
}

我遇到的错误:

Signal: SIGPIPE (signal SIGPIPE)
Terminated due to signal 13

最佳答案

信号:SIGPIPE 在写入已被对等方关闭的连接时发生。

因此,您的对等方已关闭连接。

解决方案:不要。

这里告诉你的关于 send() 导致程序崩溃或在阻塞模式下返回短计数的所有内容都是无稽之谈。 Posix 要求它阻塞,直到所有数据都传输完毕或发生错误,而这正是正在发生的情况。

关于c - 套接字接收不能进入 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49040259/

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