c - C 中的 TCP/IP 简单文件服务器在 C 中读取服务器上的问题

标签 c sockets

我将向您展示我的服务器和客户端循环。

事实是,我对要在客户端发送的文件进行了 fwrite,然后将其写入服务器,但服务器的读取没有收到我写入的字节总数,例如如果丢失一些字节。我该如何改变这一点?

这是我的循环:

BUF和BUFF等于1024。

客户端.c:

  while(taille)
  {
  size=fread(buffer,1,BUF,f_read);
  write(sock, buffer,size);
  taille -=size;
  stat+=size;
  }

服务器.c:

  //I do the loop with x to try to fix the bytes lost, but don't work :/
  int x = 0;
  while(size)
  {
   while(x!=BUFF)
   {
     x=read(service, mess_recu, BUFF);
   }
   fwrite(mess_recu,x,1,f_write);
   size-=x;
   x=0;
  }

最佳答案

据我所知,您可以想象如果您向套接字发送 1000 个字节,您将能够进行读取并获取 1000 个字节。事情的运作方式并非如此。

发生的情况有些复杂,因为它取决于您使用的套接字类型。对于 TCP,套接字是面向流的,因此您将读取执行读取时流上恰好有多少字节。最终这将加起来等于您发送的字节总数,但您必须进行多次读取。

如果您使用面向数据报的套接字(如 UDP)。您的读取将对应于通过线路发送的数据报。例如,如果您发送 700 字节的数据报,您将在远程端收到 700 字节的数据报。问题在于,与 TCP 不同,各个读取和写入彼此之间没有排序,因此,如果您发送一个 5 字节的数据包和第二个 7 字节的数据包,则读取器既不能保证任何特定的顺序,也不能保证它会得到任何数据。根本没有数据包。

关于c - C 中的 TCP/IP 简单文件服务器在 C 中读取服务器上的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41172189/

相关文章:

java - 使用 android 和 Java 套接字连接到服务器,并需要用户的许可

c++ - 使用套接字通信阻止服务器-客户端之间的连接

c - 当用户终止程序时如何关闭初始化的连接

c - 使用 scanf ("%d\n"时出现意外输出)

c - 我怎样才能让这个蛮力算法逐步检查字母

c - 如何在 LLDB 中设置 const char* 变量

c - 在C中将unsigned int变量的值存储在char数组中

c - 将 C 函数导入 Perl 程序

linux - perl 无法在 linux 上获取 SSL 套接字

python web-socket 客户端此日志记录来自哪里?