受信バッファ
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; }