3

LAN に 2 台のマシン A と B があり、A に UDP クライアントがあり、B に UDP サーバーがあります。

for(;;){
    n = recvfrom(sockfd, mesg, 10000, 0, (struct sockaddr *)&cliaddr, &len);
    ....}

UDP クライアントが最初のデータグラム
を送信するときに、データグラム データ ペイロードをmesg正しく取得できます
が、構造cliaddrが満たされていない
ことbzero(&cliaddr, sizeof(cliaddr));に気付き
ましgdbた 。

$1 = {sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = 
 "\000\000\000\000\000\000\000"}

最初のデータグラムが受信されたとき、recvfrom() が構造を満たさない理由は何cliaddrですか?

後続のデータグラムについては、有効な情報を取得できます。

4

1 に答える 1

6

呼び出す前に、引数recvfromを適切に初期化する必要があります。len

例えば

len = sizeof(struct sockaddr_in);
n = recvfrom(..., &len);

この関数は、長さを使用して、ポインターが実際に指しているrecvfrom構造の種類を判別します。sockaddr

于 2013-04-09T10:04:07.403 に答える