C++ 如何停止从套接字C/C+接收数据+;

C++ 如何停止从套接字C/C+接收数据+;,c++,c,sockets,tcp,C++,C,Sockets,Tcp,关键是我发送4096个字节,但一次只发送119个字节。携带有用的信息 100字节以\r\n\r\n结尾,因此在客户端中,当我读取\r\n\r\n时,我希望停止从该字符串接收信息,然后重新开始 我不知道我是要冲水,还是要关上插座,或者别的什么 它们是TCP套接字 在客户端中我执行以下操作: buf details[4096]; strcpy(details,"1"); strcat(details,"10/04/12"); strcat(details,"Kevin Fire"); st

关键是我发送4096个字节,但一次只发送119个字节。携带有用的信息

100字节以\r\n\r\n结尾,因此在客户端中,当我读取\r\n\r\n时,我希望停止从该字符串接收信息,然后重新开始

我不知道我是要冲水,还是要关上插座,或者别的什么

它们是TCP套接字

客户端中我执行以下操作:

 buf details[4096];
 strcpy(details,"1");
 strcat(details,"10/04/12");
 strcat(details,"Kevin Fire");
 strcat(detils,"abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde\r\n\r\n");
 nbytes_sent = send(sock,(char *)details,sizeof(details),0);
另一方面,服务器

char buf[20];
memset(buf,'\0',20);

while(!end){
 nbytes_read=recv(sclient,(char *)ress,sizeof(ress),0);

 if(strcmp(ress,"1")==0){
   printf("Details: %s (%i)\n",buf,nbytes_read);
   while(strcmp(buf,"\r\n\r\n") != 0){
     nbytes_read=recv(sclient,(char *)buf,sizeof(buf),0);
     cout.flush();
     printf("Details: %s (%i)\n",buf,nbytes_read);
   }                                     }
   if(strcmp(buf,"\r\n\r\n")==0) printf("The End\n");
   cout.flush();
 }
}
我只想读一个新的“ress”,而不是检索其他无用的字节


提前感谢。

我不确定我是否完全按照您的问题进行了回答,但似乎只要您检测到接收到的消息结束,就可以设置
end=true

char buf[20];
memset(buf,'\0',20);
while(!end)
{
    nbytes_read=recv(sclient,(char *)ress,sizeof(ress),0);
    if(strcmp(ress,"1")==0)
    {
        printf("Details: %s (%i)\n",buf,nbytes_read);
        while(strcmp(buf,"\r\n\r\n") != 0)
        {
            nbytes_read=recv(sclient,(char *)buf,sizeof(buf),0);
            cout.flush();
            printf("Details: %s (%i)\n",buf,nbytes_read);
        }
    }
    if(strcmp(buf,"\r\n\r\n")==0)
    {
        end = true; // <--- This should do it for you, right?
        printf("The End\n");
    }
    cout.flush();
}
charbuf[20];
memset(buf,'\0',20);
当(!结束)
{
nbytes_read=recv(sclient,(char*)ress,sizeof(ress),0);
如果(strcmp(ress,“1”)==0)
{
printf(“详细信息:%s(%i)\n”,基本单位,n字节\u已读);
while(strcmp(buf,“\r\n\r\n”)!=0)
{
nbytes_read=recv(sclient,(char*)buf,sizeof(buf),0;
cout.flush();
printf(“详细信息:%s(%i)\n”,基本单位,n字节\u已读);
}
}
如果(strcmp(buf,“\r\n\r\n”)==0)
{

end=true;//如果您像HTTP 1.0那样设计协议,其中每个请求都会打开一个新的套接字,那么在阅读足够的内容后,您就可以关闭该套接字


否则,您需要继续读取,直到跳过整个4096字节。最简单的方法是继续读取,直到首先得到4096字节(您需要在循环中调用
recv
),然后解析缓冲区的内容。再次强调,您最好重新设计协议。

如果您的意思是要丢弃其余数据并读取新块,则不能使用TCP,因为它是面向流的,没有消息概念,也不知道要忽略的消息的其余部分。如果您还有什么,请详细描述一下


但除此之外,当只有
\r\n'之前的数据很重要时,为什么要使用
nbytes\u sent=send(sock,(char*)details,sizeof(details),0)
。您可以使用
nbytes\u sent=send(sock,(char*)details,strlen details,0)59440。
4个字符可能是预期的缓冲区大小

例如,如果您的消息是: ABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDE\r\n\r\n

它是(使用您的示意图)100字节,加上\r\n\r\n。所以它是100+4,所以是104

我会在字符串的开头发送char(104),作为sentinal值 然后在后面加上它的字符串,这样看起来就像

字符(104)ABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDEABCDIABCDE\r\n\r\n


然后使用recv的peek_MSG功能获取第一个字符,设置字符串大小,只读该值,剩下的任何内容都会被您进行的套接字刷新调用丢弃。

您如何知道何时“重新开始”?如果“\r\n\r\n”在“消息”的末尾,则您需要立即开始读取。如果没有(如中所示,
\r\n\r\n
后面可能有其他适用于当前消息而不是“下一条”消息的数据)如何知道从何处开始读取“下一条字符串”?可能重复的请看这个答案:它完全回答了您的问题。@Chad客户端只需发送一个请求,然后等待我键入的字符输入。因此服务器必须打印我发送的信息,然后等待我将从客户端发送的新请求。但我如何结束从该客户端接收其余数据的工作使用终止符的缓冲区\r\n\\r\n??如果您解释了客户端发送服务器不关心的数据的原因,我认为这会很有用。是因为您确信客户端必须或应该发送固定长度的块吗?如果是,您应该重新检查该假设。客户端只发送一个请求,然后等待字符输入所以服务器必须打印我发送的信息,然后等待我从客户端发送的新请求。BigBoss是对的……您的选项是1)读取并丢弃不需要的数据,或者2)关闭套接字。