1

以下に、Winsock を使用して C++ で非常に基本的な UDP 送信者を実装する私のコードを示します。問題は、コードを何度実行しても、ソケット (listenSocket) が別の UDP ポートにバインドされることです。これには具体的な理由はありますか?コードに間違いがありますか?

ありがとう

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
    WSADATA wsaData;    
    SOCKADDR_IN myAddress;
    SOCKADDR_IN targetAddress;

    int myPort = 60888;
    const char *myIP = "192.168.0.1";
    int remotePort = 2048;
    const char *remoteIP = "192.168.0.2";

    SOCKET ListenSocket = INVALID_SOCKET;
    SOCKET SendSocket = INVALID_SOCKET;
    SOCKET acceptSocket;

    char cBuffer[1024] = "Test Buffer";
    int nBytesSent = 0;
    int nBufSize = strlen(cBuffer);
    int iResult;

    // Initialize Winsock
    if( WSAStartup( MAKEWORD(2, 2), &wsaData ) != NO_ERROR )
    {
        cerr<<"Socket Initialization: Error with WSAStartup\n";
        system("pause");
        WSACleanup();
        exit(10);
    }

    ListenSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    if (ListenSocket == INVALID_SOCKET or SendSocket == INVALID_SOCKET)
    {
        cerr<<"Socket Initialization: Error creating socket"<<endl;
        system("pause");
        WSACleanup();
        exit(11);
    }

    //bind
    myAddress.sin_family = AF_INET;
    myAddress.sin_addr.s_addr = inet_addr(myIP);
    myAddress.sin_port = htons(myPort);

    targetAddress.sin_family = AF_INET;
    targetAddress.sin_addr.s_addr = inet_addr(remoteIP);
    targetAddress.sin_port = htons(remotePort);

    if(bind(ListenSocket, (SOCKADDR*) &myAddress, sizeof(myAddress)) == SOCKET_ERROR)
    {
        cerr<<"ServerSocket: Failed to connect\n";
        system("pause");
        WSACleanup();
        exit(14);
    }
    else
        printf("Server: bind() is OK.\n");

    nBytesSent = sendto(SendSocket, cBuffer, nBufSize, 0,
                 (SOCKADDR *) &targetAddress,
                 sizeof(SOCKADDR_IN));    

    printf("Everything is ok\n");

    system("PAUSE");

    closesocket(ListenSocket);
    closesocket(SendSocket);

    return EXIT_SUCCESS;
}

編集:多分私はそれほど明確ではありませんでした。このコードで行うことは、リモート PC にデータを送信することです。ただし、UDP セグメントが特定のポートから発信されたように見える必要があります。これはどのように行うことができますか?私がここでやっていることは間違っていますか?今考えると、それは間違いだと思います。SendSocket と ListenSocket には接続がありませんよね?では、UDP セグメントが特定の UDP ポートから発信されているように見せるにはどうすればよいでしょうか? ありがとう!

4

1 に答える 1

3

データを送信する前に呼び出しているわけではないbind()ので、WinSock はそのソケットを必要なランダムなローカル IP/ポートに自由にバインドできます。SendSocket毎回特定の送信元 IP/ポートでデータを送信する必要がある場合は、bind()最初にその IP/ポートに送信する必要があります。そのローカル IP/ポートがバインドListenSocket先と同じペアである場合、最初から 2 つの別々のソケットを使用する必要はありません。着信データをリッスンしているのと同じソケットでデータを送信できます。

于 2012-05-31T21:08:16.317 に答える