C++ 如何停止从套接字C/C+接收数据+;
关键是我发送4096个字节,但一次只发送119个字节。携带有用的信息 100字节以\r\n\r\n结尾,因此在客户端中,当我读取\r\n\r\n时,我希望停止从该字符串接收信息,然后重新开始 我不知道我是要冲水,还是要关上插座,或者别的什么 它们是TCP套接字 在客户端中我执行以下操作: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
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)关闭套接字。