0

关键是我发送了 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”,而不是检索其余无用的字节。

提前致谢。

4

4 回答 4

1

如果您的意思是要丢弃其余数据并读取新块,则无法使用 TCP 执行此操作,因为它是面向流的,并且没有消息的概念,并且不知道要忽略的其余消息. 如果你的意思是别的,请描述更多。

但除此之外,为什么你nbytes_sent = send(sock,(char *)details,sizeof(details),0);只使用数据直到\r\n' is important. you can usenbytes_sent = send(sock,(char *)details,strlen(details),0);` 只发送有效数据并减少你通过网络发送的垃圾,你不需要在服务器重新开始??

于 2012-10-02T20:38:50.077 回答
0

我不确定我是否完全关注您的问题,但您似乎可以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();
}

但是,如果客户端仍处于连接状态并将下一条消息写入套接字,那么您只需要开始读取下一条消息即可。那么一旦消息被写入,客户端会发生什么?它是开始写下一条消息还是关闭套接字连接?

另外:您需要获取缓冲区中的内容并从中创建消息。当前消息完成后,请考虑使用下一条消息的缓冲区内容创建一条新消息。

于 2012-10-02T19:31:24.067 回答
0

如果您像 HTTP 1.0 一样设计您的协议,其中每个请求都会打开一个新套接字,然后在您阅读足够多的内容后关闭该套接字。

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

于 2012-10-02T19:32:01.337 回答
0

我的想法是只看前 x 个字符。4 个字符可能是预期缓冲区的大小。

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

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

我会在你的字符串的开头发送 char(104) 作为一个标记值,然后是它之后的字符串,所以它看起来类似于

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

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

于 2012-10-02T22:24:50.177 回答