揮発性のメモ2

http://d.hatena.ne.jp/iww/

recvfromでバグを作りこむ

int result;
char buf[256];
struct sockaddr_storage addr;
socklen_t addrlen = 0; // ★バグ

for(;;){
    result = recvfrom(sd, buf, sizeof(buf), 0, &addr, &addrlen);
    if(result<0) continue;
    
    sendto(sd, "OK", 2, 0, &addr, addrlen);
}

recvfromで、アドレス情報を格納する領域を用意したのに大きさを間違って0とか書いてしまったときに けっこう面倒なバグが発生する。


アドレス情報サイズaddrlenに 0 が入ってるので、アドレス情報addrには何も書かれない(ゴミが残る)。
しかし、addrlenには返すつもりだったアドレス情報サイズがちゃんと入る。
挙句の果てに 結果resultは正常(0)になる。


「無限ループで UDPでデータ受信して送信してきた人に応答を返す」
みたいなコードを書いているとき、「なんでか最初の1回だけ応答を返さない」というバグとして現れる。

    addrlen = sizeof(addr); // ←ちゃんとこれを書く
    result = recvfrom(sd, buf, sizeof(buf), MSG_DONTWAIT, &addr, &addrlen);