受信バッファ

UDPを使ったリアルタイムデータ転送の実験。結論的には、細やかなパケットを連続的に送る場合は、バッファサイズを減らしてやると、バッファが溜まらず、想像通りの動きをする。というかレスポンス重視のアプリの場合は、バッファサイズは減らした方がよいみたい。下の例では、usleepのタイミングを受信側の方を微妙に遅くしていることで、一定間隔のデータ欠損を確認できる。SETOPTのdefineをいじると挙動が変わる。
受信側

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
    int sock;
    int val;
    struct sockaddr_in addr;
    char buf[2048];
    int len = sizeof(val);
    int tmp,tmptmp;
    int error = 0;

    sock = socket(AF_INET, SOCK_DGRAM, 0);

    if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &val, &len) == -1 ) {
        perror("failed to getsockopt");
        exit(1);
    }

    printf("%d\n",val);

#define SETOPT
#ifdef SETOPT
    val =512;
    if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
                   (char *)&val, sizeof(val)) < 0) {
        perror("setsockopt(,,SO_RCVBUF,,)");
        exit(15);
    }
#endif
    if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &val, &len) == -1 ) {
        perror("failed to getsockopt");
        exit(1);
    }

    printf("%d\n",val);

    addr.sin_family = AF_INET;
    addr.sin_port = htons(12345);
    addr.sin_addr.s_addr = INADDR_ANY;

    bind(sock, (struct sockaddr *)&addr, sizeof(addr));

    tmptmp = -1;
    while(1) {
        memset(buf, 0, sizeof(buf));
        recv(sock, buf, sizeof(buf), 0);
        tmp = ((int)buf[3] << 24) | ((int)buf[2] << 16) | ((int)buf[1] << 8) | ((int)buf[0
]);

        error = error + (tmp - tmptmp -1);
        tmptmp = tmp;
        printf("%d error = %d\n", tmp,error);
        usleep(33000);
    }

    close(sock);

    return 0;
}

送信側。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(){
 int sock;
 struct sockaddr_in addr;
 int i;
 sock = socket(AF_INET, SOCK_DGRAM, 0);

 addr.sin_family = AF_INET;
 addr.sin_port = htons(12345);
 addr.sin_addr.s_addr = inet_addr("192.168.11.202");

 i = 0;
 while(1){
    sendto(sock, &i, 4, 0, (struct sockaddr *)&addr, sizeof(addr));
    i++;
    printf("%d\n",i);
    usleep(33333);
 }

 close(sock);

 return 0;
}