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);