【问题标题】:C: TCP server doesnt receive the whole messageC: TCP 服务器没有收到整个消息
【发布时间】:2017-09-01 10:05:18
【问题描述】:

大家好,我正在尝试创建一个服务器,该服务器将接收如下消息:“str1\0str2\0str3\0”,然后在子字符串中分开。在客户端,一切似乎都正常,但是当我在服务器端收到消息时,我只收到“str1”。任何帮助将不胜感激!

服务器:

   bzero(buffer,256);
   n = read( newsockfd,buffer, 255 );

   if (n < 0) {
      perror("ERROR reading from socket");
      exit(1);
   }

   printf("Here is the message: %s\n",buffer);


   for(int i = 0; i < strlen(buffer); i++){
       printf("%c", buffer[i],i);
       if ( buffer[i] == 0 ){
       printf("0");
     }
   }`

客户:

   char buffer[256];
   int length =0;
   char *uptr = buffer;
   int i;

       strcpy(uptr,argv[3]);
       length = length + strlen(argv[3])-3;

       for ( i = 4 ; i < argc  ; i++){

          memcpy(uptr+length+i, argv[i]  ,strlen(argv[i]) +1);

          length = length + strlen(argv[i]);

       }

       buffer[length + (argc - 1)]= 0;


       for(i = 0; i < length + argc; i++){
           printf("%c", buffer[i],i);

       }

【问题讨论】:

  • 你怎么知道你只收到“str1”?如果你 printf 输出 'n' 你会得到什么?
  • \0 标记 C 中字符串的结尾,您可能收到了所有数据,但打印函数假定字符串已结束。
  • .. 此外,这很有可能,(尽管不太可能)。由于 TCP 的八位字节流性质,您第一次只能得到 's'。
  • 你在用你的uptrlength做奇怪的事情。在memcpy( 中,您将当前循环计数器添加到您的目标地址。在循环之后,您将字符串长度加上参数计数。您复制 argv[3] 但添加 strlen(argv[3])-3? argv[1] 和 [2] 怎么样。没有测试 argv[3] 是否可用。
  • for( ; i &lt; strlen(buffer); ) 无论您收到多少字节,这都会在第一个 \0 处停止。 printf("%c", buffer[i],i); 这是格式字符串和参数不匹配的问题。您的客户没有发送任何内容。

标签: c tcp server null client


【解决方案1】:

您从未编写任何代码来接收消息。因此,您的代码没有收到消息也就不足为奇了。

  bzero(buffer,256);
  n = read( newsockfd,buffer, 255 );

这会读取一些可能是也可能不是消息的数据。毕竟,read 函数不知道你的消息是什么样的。

printf("Here is the message: %s\n",buffer);

等等,什么?是什么让这成为一条信息?这只是您从连接中读取的一些字节。这不是一条消息。

您需要编写一些代码来接收消息,否则您将不会收到消息,而只会收到来自连接的一堆字节。

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2016-04-26
    • 2012-03-10
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多