【问题标题】:client server using TCP in C [closed]在C中使用TCP的客户端服务器[关闭]
【发布时间】:2018-03-06 23:25:45
【问题描述】:

我正在开发客户端服务器项目,我必须从服务器端的文件中搜索客户端请求的数据。

我在客户端的代码:

        printf("Enter data to search: \n");
        fgets(buf,sizeof(buf),stdin);
        send(s,buf, strlen(buf),0);
        printf("Result of your search: ");
        if(len = recv(s, buf, sizeof(buf),0)>0)
        printf("\nMessage Received From Server -\n  %s\n",buf);

我在服务器端的代码:

            fp=fopen("courses.txt","r");

            len=recv(new_s,buf,sizeof(buf),0);

            char temp[256],tmp[512];
            char *search;



            while(fgets(tmp, 512, fp)!=NULL)
            {
                search= strstr(tmp, buf);
                if(search)
                {    
                    send(new_s,tmp,strlen(tmp),0);

                }  

            }

strstr() 总是返回一个空值,因此它永远不会进入 if 语句。

【问题讨论】:

  • 什么不完全有效?
  • “似乎不起作用”不是一个充分的问题陈述。请证明minimal reproducible example
  • @a_s741 fgets 追加换行符 '\n' 我认为你应该像 buf[ strcspn( buf, "\n" ) ] = '\0'; 一样删除它
  • 你有两个问题。一是你忽略了recv的返回值,所以你不知道你收到了多少字节。但另一个更基本——您没有任何协议来指定如何交换消息。这似乎是您的用例的要求。查询是一条消息,所以你需要一个消息协议,而 TCP 不是。
  • @VladfromMoscow 但是在你可以使用strcspn之前,他必须已经将它转换成一个C风格的字符串。这对我来说似乎有点不合逻辑和倒退。 (因为无论如何他都需要找到换行符将其转换为字符串。)

标签: c tcp client-server


【解决方案1】:

TCP 不是消息协议。如果您想发送和接收消息(您的查询是),您需要一个消息协议。首先精确定义消息的边界方式(在字节级别),然后编写代码来发送和接收消息。

另外,不要忽略recv 的返回值。你怎么知道你收到了多少字节?除了 C 风格的字符串,不要使用像 strlenstrcpy 这样的函数。为方便起见,您可以让您的发送和接收消息函数接受和返回 C 风格的字符串。但是,在您的代码将其变为一个之前,不要假设线路上的数据将是 C 样式的字符串。

【讨论】:

  • 这应该有一个规范 - 有数千个这样的“忽略 TCP 的流传输性质”、“滥用 str* 调用”和“无法完全正确地处理从 recv 返回的结果) .
  • 是的。这是其中之一,每个人的第一次尝试都会犯下所有可能的错误。不幸的是,即使您没有解决所有问题,它仍然可能会碰巧有时会因运气/意外而起作用。我们可能在某个地方确实有一个规范的答案。
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多