1

次のように getsockname を呼び出すコードが Windows にあります。

getsockname(*x,NULL,0)

3 番目のパラメーター (namelen) は IN\Out パラメーターで、名前バッファーのサイズ (バイト単位) が含まれています。返されると、namelen パラメータには name パラメータの実際のサイズ (バイト単位) が含まれます。
さて、私の質問は、名前がnullに等しく、namelenがゼロに等しい場合にどうなるかということです.Linuxでtahtを見ました.nameがNULLの場合、namelenは無視されますが、MSDNはこのケースについて何も言及していません. . MSDN のリンクはこちら Linux の IBM のリンクはこちら

前もって感謝します

4

1 に答える 1

3

コードでは、3 番目のパラメーターにゼロを渡しています。

仕様によれば、3 番目のパラメーターを null にすることはできません。2 番目のパラメーターの長さを示す整数へのポインターである必要があり、出力ではアドレスの実際のサイズが示されます。ゼロを渡すことは、ストレージが割り当てられていないことを意味するのではなく、情報も出力値を書き込む場所も渡していないことを意味します。

MSDN および Linux のドキュメントによると、関数は -1 を返し、errno(またはWindows ソケットではEFAULTWSAGetLastError をon に) に設定する必要があります。WSAEFAULTこれは、「name および namelen パラメーターを指定どおりに使用すると、呼び出し元のアドレス空間外のストレージにアクセスしようとする結果になる」と定義されています。

ただし、これは Posix 仕様の一部ではありません。関数がアドレスをチェックする必要があるとは考えていません。つまり、少なくとも Posix では、これは未定義の動作です。つまり、何でも起こり得るということです。

Linux では、null が渡された場合に 2 つのパラメーターが無視されることを観察したと言います。コードが戻り値をチェックしていないと思われます。これはおそらく -1 でerrnoset to になりEFAULTます。

Posix 関数は例外をスローしません。おそらく次のような戻りコードを確認する必要があります。

int result = getsockname(*x,NULL,0); 
if(result){
    /*Failed - handle here*/ 
} 
于 2012-10-18T10:25:47.373 に答える