gpt4 book ai didi

c - 服务器写入套接字但数据未到达客户端

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:01 25 4
gpt4 key购买 nike

我正在为我的网络类(class)编写一个简单的服务器,但我无法将数据正确传输到客户端(由教授提供)。

完成所有设置并建立连接后,我开始读取文件 block 并将它们写入套接字,检查读取和写入函数的返回值是否匹配。我还保留了读/写字节的运行总数,并将其与总文件大小进行比较(通过 stat.st_size ),它们都匹配。

无论我请求同一个文件多少次,服务器端的日志始终具有正确的指标。客户端偶尔会丢失文件的末尾。从一次调用到下一次调用,实际大小和预期大小之间的差异几乎从不相同,而且它似乎总是丢失文件的末尾,中间没有任何部分。到达文件的大小也是 512( block 大小)的倍数。

所以,似乎有一些完整的 block 正在生成,然后其余的以某种方式丢失了。:w

#define CHUNK_SIZE     512
/* other definitions */

int main()
{
/* basic server setup: socket(), bind(), listen() ...
variable declarations and other setup */

while(1)
{
int cliSock = accept(srvSock, NULL, NULL);
if(cliSock < 0)
; /* handle error */

read(cliSock, filename, FILE_NAME_SIZE - 1);
int reqFile = open(filename, O_RDONLY);
if( reqFile == -1)
; /* handle error */

struct stat fileStat;
fstat(reqFile, &fileStat);
int fileSize = fileStat.st_size;

int bytesRead, totalBytesRead = 0;
char chunk[CHUNK_SIZE];
while((bytesRead = read(reqFile, chunk, CHUNK_SIZE)) > 0)
{
totalBytesRead += byteasRead;
if(write(cliSock, chunk, bytesRead) != bytesRead)
{
/* perror(...) */
/* print an error to the log file */
bytesRead = -1;
break;
}
}
if (bytesRead == -1)
{
/* perror(...) */
/* print an error to the log file */
close(cliSock);
continue;
}

/* more code to write transfer metrics etc to the log file */
}
}

所有删除的错误处理代码都是将错误消息打印到日志文件并返回循环顶部的某种形式。


编辑翻转了一个<那应该是 >

最佳答案

当您将所有想要的数据写入套接字时(或者可能只是退出进程,它会做同样的事情),您可能会毫不客气地使用 close() 关闭套接字。

这是不对的——如果对方发送了一些你没有读过的数据1,连接将被重置。重置可能导致未读数据丢失。

相反,您应该使用 shutdown() 正常关闭套接字的写入端,然后等待客户端关闭。像这样的东西:

ssize_t bytesRead;
char chunk[CHUNK_SIZE];

shutdown(cliSock, SHUT_WR);

while((bytesRead = read(cliSock, chunk, CHUNK_SIZE)) != 0)
{
if (bytesRead < 0)
{
if (errno != EINTR)
{
/* perror() */
/* print error in log file */
break;
}
}
else
{
/* maybe log data from client */
}
}

close(cliSock);


<补充>1。这可以包括 EOF,如果另一方关闭了它的写入 channel 。

关于c - 服务器写入套接字但数据未到达客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8319673/

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