0

2 台のリモート コンピューター間でメッセージを交換する単純なアプリを作成しようとしています。「127.0.0.1」IPでは正常に動作し、クライアントの確認を待ってクライアントに接続しますが、ローカル「192.168.0.15」または同じポートでグローバルIPを試すと、サーバーはすぐにsthに接続しますクライアントを待っています。

これが私のサーバーコードの一部です:

char ip[20] = "127.0.0.1"; int port = 19385;

SOCKET sockListen, sockConnect;

SOCKADDR_IN address;

sockConnect = socket (AF_INET, SOCK_STREAM, NULL);
address.sin_addr.s_addr = inet_addr (ip);
address.sin_family = AF_INET;
address.sin_port = htons (port); 
sockListen = socket (AF_INET, SOCK_STREAM, NULL);

bind (sockListen, (SOCKADDR*)&address, AddressSize);
listen (sockListen, SOMAXCONN);

sockConnect = accept (sockListen, (SOCKADDR*)&address, &AddressSize);

...

問題を解決する方法を提案してください。どうも

4

1 に答える 1

0

を呼び出す前に でsockConnect変数を初期化することは想定されていません。 すでにクライアントに接続されている、新しく割り当てられたソケット ハンドルを返します。割り当てたソケット ハンドルをリークしています。socket()accept()accept()socket()

bind()アプリが実行されているローカル マシンの NIC に属する IP に対してのみ可能です。bind()外部 IP には接続できません。

あなたが示したコードは、エラー処理をまったく行っていません。それを追加する必要があります。

int errCode;

SOCKET sockListen = socket (AF_INET, SOCK_STREAM, NULL); 
if (sockListen == INVALID_SOCKET)
{
    errCode = WSAGetLastError();
    // ...
}
else
{ 
    SOCKADDR_IN address = {0}; 
    address.sin_addr.s_addr = inet_addr (ip); 
    address.sin_family = AF_INET; 
    address.sin_port = htons (port);  

    if (bind (sockListen, (SOCKADDR*)&address, sizeof(address)) == SOCKET_ERROR)
    {
        errCode = WSAGetLastError();
        // ...
    }
    else
    {
        if (listen (sockListen, SOMAXCONN) == SOCKET_ERROR)
        {
            errCode = WSAGetLastError();
            // ...
        }
        else
        {
            int addressSize; 

            SOCKET sockClient = accept (sockListen, (SOCKADDR*)&address, &addressSize); 
            if (sockClient == INVALID_SOCKET)
            {
                errCode = WSAGetLastError();
                // ...
            }
            else
            {
                // ...
                closesocket(sockClient);
            }
        }
    }

    closesocket(sockListen);
}
于 2012-08-08T16:51:05.567 に答える