2

I've got a piece of code:

while(1) {
    if(recvfrom(*val, buffer, 1024, MSG_PEEK, NULL, NULL)==-1) {    
        perror("recv");
        exit(1);
    } else printf("recv msgpeek\n");
    if(*(int*)buffer>5) {
        if(recvfrom(*val, buffer, 1024, 0, NULL, NULL)==-1) {   
            perror("recv");
            exit(1);
        } else printf("recv\n");
        if(*(int*)buffer==6) {
                    printf("%d\n", *(int*)(buffer+sizeof(int)+30));
                    printf("%s\n", (char*)buffer+sizeof(int));
                }
   }

This is part of a client programme. I'm sending messages from server to this client and I've noticed that when client receives this messages, they're connected. I'm using SOCK_STREAM type sockets. Anyone know how to avoid connecting messages?

4

2 に答える 2

2

私があなたを正しく理解していれば、あなたはTCPソケットから読み取っていて、反対側から「送信」したのとまったく同じバイト数を取得することを期待しています。ここであなたの仮定は間違っています。TCPソケットは双方向ストリームです。つまり、TCPソケットを介して送信するアプリケーションメッセージの境界は保持されません。接続の一方の側で「書き込み」を行うと、もう一方の側で複数の「読み取り」が発生する可能性があり、逆に、複数の「書き込み」を一緒に受信する可能性があります。その最後のケースはあなたが見ているものです。メッセージの境界を追跡するのはあなたの責任です。

関連する質問-TCPでデータを受信します

于 2012-06-11T20:13:38.687 に答える
0

私がよく理解しているなら、あなたの問題は、たとえばメッセージを2つ送信するが、送信された2つのメッセージの内容を含む1つを受信することです。これは、TCPが効率を改善するために使用するNagleのアルゴリズムによるものです。このアルゴリズムを無効にする場合は、TCP_NODELAYオプションを使用してください。

于 2012-06-11T20:12:27.693 に答える