账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    linux下tcp编程,客户端给服务端传文件,服务端如何判断文件传输结束?
    34
    0

    如题,我的想法是客户端在把文件传完后,再传一段字符串作为特殊标志,告诉服务端已经传送完毕,这就意味着服务端那边读到数据就得判断一下是不是这个特殊标志。

    想法比较简单暴力,刚接触这方面,希望各位老手能给一个正确的解决方案,提示一下。

    2
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 痴人说梦Stupid- 普通会员 1楼

      在Linux下,你可以使用TCP连接的超时机制来判断文件传输是否结束。当客户端发送文件后,服务端需要在一定时间内接收并确认客户端的连接,如果超过这个时间,服务端可以认为文件传输已经结束。

      以下是一个简单的示例:

      ```c

      include

      include

      include

      include

      include

      include

      include

      define MAX_CONNECTIONS 100

      int main(int argc, char *argv[]) { int server_sock, client_sock; struct sockaddr_in server_addr, client_addr; struct sockaddr_in server_addr_in, client_addr_in_in; struct sockaddr_in serv_addr_in, serv_addr_in_in_in; struct iovec iovec_data;

      if (argc != 2) {
          printf("Usage: %s <server_ip>\n", argv[0]);
          return 1;
      }
      
      server_sock = socket(AF_INET, SOCK_STREAM, 0);
      if (server_sock == -1) {
          perror("socket failed");
          return 1;
      }
      
      server_addr.sin_family = AF_INET;
      server_addr.sin_port = htons(8080);
      server_addr.sin_addr.s_addr = INADDR_ANY;
      
      if (bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
          perror("bind failed");
          return 1;
      }
      
      if (listen(server_sock, MAX_CONNECTIONS) == -1) {
          perror("listen failed");
          return 1;
      }
      
      while (true) {
          client_sock = accept(server_sock, (struct sockaddr *)&client_addr, sizeof(client_addr));
          if (client_sock == -1) {
              perror("accept failed");
              continue;
          }
      
          memset(&iov_data, 0, sizeof(iov_data));
         iov_data.iov_size = strlen(argv[1]);
      
          send(client_sock, argv[1], iov_data.iov_size, 0);
          char buf[1024];
          recv(client_sock, buf, sizeof(buf), 0);
          if (recv(client_sock, "\n", sizeof("\n"), 0) == -1) {
              perror("recv failed");
              continue;
          }
          printf("Received: %s\n", buf);
      
          // Check for file transfer结束
          iovec_data.iov_base = buf;
          iovec_data.iov_size =iov_data.iov_size - 1;
          if (send(client_sock, &iov_data, sizeof(iov_data), 0) == -1) {
              perror("send failed");
              continue;
          }
      
          if (recv(client_sock, "\n", sizeof("\n"), 0) == -1) {
              perror("recv failed");
              continue;
          }
          printf("Received: %s\n", buf);
      
          if (strcmp(server_addr.sin_addr.s_addr, INADDR_ANY) != 0) {
              close(client_sock);
              break;
          }
      }
      
      close(server_sock);
      
      return 0;
      

      } ```

      在这个示例中,服务端监听8080端口,当有客户端连接时,它会读取客户端发送的文件内容,然后检查客户端发送的文件结束符,如果与服务端的地址不匹配,服务端会关闭客户端连接,然后结束整个文件传输。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部