C中使用TCP的客户机服务器

C中使用TCP的客户机服务器,c,tcp,client-server,C,Tcp,Client Server,我正在从事客户机-服务器项目,我必须从服务器端的文件中搜索客户机请求的数据 我的客户端代码: 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),

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

我的客户端代码:

        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()始终返回null值,因此它从不进入if语句

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


另外,不要忽略
recv
的返回值。你怎么知道你收到了多少字节?除了C样式的字符串外,不要使用诸如
strlen
strcpy
之类的函数。为了方便起见,您可以使发送和接收消息函数接受并返回C样式的字符串。但是,在您的代码生成C样式字符串之前,不要假设连接上的数据是C样式字符串。

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


另外,不要忽略
recv
的返回值。你怎么知道你收到了多少字节?除了C样式的字符串外,不要使用诸如
strlen
strcpy
之类的函数。为了方便起见,您可以使发送和接收消息函数接受并返回C样式的字符串。但是,在代码生成C样式字符串之前,不要假设连接上的数据是C样式字符串。

什么不起作用?“似乎不起作用”不是一个适当的问题陈述。请证明a。@a\u s741 fgets附加了新行字符'\n',我认为您应该像buf[strcspn(buf,“\n”)]='\0'一样删除它;你有两个问题。一个是忽略返回值
recv
,因此不知道接收到多少字节。但另一个更基本——您没有任何协议指定如何交换消息。这似乎是您的用例的一个要求。查询是一条消息,因此您需要一个消息协议,而TCP不是。@VladfromMoscow,但在您可以使用
strcspn
之前,他必须已经将其转换为C样式的字符串。在我看来,这似乎有点不合逻辑,也有点倒退。(因为他需要找到换行符才能将其转换为字符串。)什么不起作用?“似乎不起作用”不是一个适当的问题陈述。请证明a。@a\u s741 fgets附加了新行字符'\n',我认为您应该像buf[strcspn(buf,“\n”)]='\0'一样删除它;你有两个问题。一个是忽略返回值
recv
,因此不知道接收到多少字节。但另一个更基本——您没有任何协议指定如何交换消息。这似乎是您的用例的一个要求。查询是一条消息,因此您需要一个消息协议,而TCP不是。@VladfromMoscow,但在您可以使用
strcspn
之前,他必须已经将其转换为C样式的字符串。在我看来,这似乎有点不合逻辑,也有点倒退。(因为他需要找到换行符才能将其转换为字符串。)这应该有一个规范——有成千上万的“忽略TCP的流性质”、“滥用str*调用”和“无法完全正确处理recv返回的结果”。是的。这是其中之一,因为每个人的第一次尝试都会犯下所有可能的错误。不幸的是,即使你没有修复所有的问题,它也可能偶尔会因为运气/意外而起作用。我们可能确实在某个地方有一个规范的答案。这应该有一个规范的答案-有成千上万的“忽略TCP的流性质”、“误用str*调用”和“无法完全正确地处理recv返回的结果”。是的。这是其中之一,因为每个人的第一次尝试都会犯下所有可能的错误。不幸的是,即使你没有修复所有的问题,它也可能偶尔会因为运气/意外而起作用。我们可能在某个地方有一个标准答案。