Wojciech Reszelewski
Wojciech Reszelewski

Reputation: 2706

recv() links messages

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?

Upvotes: 2

Views: 111

Answers (2)

Nikolai Fetissov
Nikolai Fetissov

Reputation: 84151

If I understood you correctly, you are reading from TCP socket, and expecting to get exactly same number of bytes as you "sent" from the other side. Here you assumption is wrong. TCP socket is a bi-directional stream, i.e. it does not preserve boundaries of the application messages you send through it. A "write" on one side of the connection could result in multiple "reads" on the other side, and the other way around, multiple "writes" could be received together. That last case is what you are seeing. It is your responsibility to keep track of message boundaries.

Related question - Receiving data in TCP.

Upvotes: 2

Manos
Manos

Reputation: 2186

If I understood well your problem is that you send 2 for example messages but you receive one, containing the contents of the two messages sent. This is due to the Nagle's algorithm that TCP uses to improve efficiency. If you want to disable this algorithm use the TCP_NODELAY option.

Upvotes: 0

Related Questions