0

私は頭痛を引き起こす最も奇妙な問題を抱えています。次のコードを検討してください。

// Create and bind socket
 std::map<Connection, bool> clients;
 unsigned short port=6222;
 struct sockaddr_in local_address, from_address;
 int result;
 char buffer[10000];
 SOCKET receive_socket;
 local_address.sin_family = AF_INET;
 local_address.sin_addr.s_addr = INADDR_ANY;
 local_address.sin_port = htons(port);
 receive_socket = socket(AF_INET,SOCK_DGRAM,0);

何が起こっているのかは、receive_socketがバインドされていないことです。SOCKET_ERRORが発生します。プログラムをデバッグしてreceive_socketを確認すると、文字化けしているように見えます。'std::map'行にブレークポイントを設定しました。上記のコードの各行にステップインすると、ステップイン(F11)を使用していても、デバッグカーソルが「unsignedshortport」行から最初の「local_address.sin」行に直接ジャンプします。 struct、int、char、またはSOCKETの行は、それらをまっすぐ飛び越えます。

この時点で、local_address、from_address、result、buffer、およびreceive_socketにマウスを合わせます。それらはすべて文字化けしたがらくたでいっぱいです。これは、これらの変数をまだ定義していないためですか?上記のコードの最後に到達すると、local_address.sin_portが19992に設定されていることにも気づきましたが、6222である必要がありますか?

編集:ifステートメントが真であるために失敗している私のバインディングコードは次のとおりです:

if(bind( receive_socket, (SOCKADDR*) &local_address, sizeof(local_address)) == SOCKET_ERROR) 
    {
        closesocket(receive_socket);
        return 1;
    }
4

3 に答える 3

1

答えがわかった!問題は、プログラムのどこにも WSAStartup を呼び出していなかったことです。最初の次のコードで修正されました。

WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
    {
        return 1; 
    }

これは、WSAGetLastError() からエラー番号を取得し、msdn で調べることでわかりました。

于 2010-03-21T01:29:23.630 に答える
0

に変更SOCK_DGRAMしてみてくださいSOCK_STREAM

MSDNによると、

SOCK_STREAM-シーケンスされた信頼性の高い双方向の接続ベースのバイトストリームにOOBデータ送信メカニズムを提供するソケットタイプ。このソケットタイプは、インターネットアドレスファミリ(AF_INETまたはAF_INET6)に伝送制御プロトコル(TCP)を使用します。

SOCK_DGRAM-データグラムをサポートするソケットタイプ。データグラムは、固定された(通常は小さい)最大長のコネクションレスで信頼性の低いバッファーです。このソケットタイプは、インターネットアドレスファミリ(AF_INETまたはAF_INET6)にユーザーデータグラムプロトコル(UDP)を使用します。

そして、ポートが行く限り...

local_address.sin_portは19992に設定されていますが、6222である必要がありますか?

htonsホストバイトオーダーのポート番号をネットワークバイトオーダーに変換します(ここを参照)

于 2010-03-21T01:00:19.643 に答える
0
local_address.sin_port = htons(port);

私はそれがかなり奇妙だと思った。また、なぜhtons()ポートなのですか?それは意味がありません。getaddrinfo()などを使用するだけでは不十分ですか、それともwinsockで手動で情報を入力する必要がありますか?

于 2010-03-21T01:01:38.503 に答える