если я слушаю 2 порта с одним сокетом прослушивания, как я могу узнать, какой порт получил пакет? - PullRequest
0 голосов
/ 05 мая 2011

У меня есть приложение, которое прослушивает 2 порта. Похоже, что когда я вызываю свою функцию WS_SetUpListener (см. Код ниже) с 2 различными портами, я получаю один и тот же ListeningSocket для обоих, поэтому, когда пакет поступает на любой из2 порта, как я могу узнать, на какой порт он был отправлен?

Я вызываю функцию следующим образом:

ListeningSocket = WS_SetUpListener(port);

код для этого:

SOCKET WS_SetUpListener(int port)
{
char port_buf[20] = {0};
struct addrinfo *result = NULL, hints;

SOCKET ListenSocket = INVALID_SOCKET;

//char recvbuf[DEFAULT_BUFLEN];
int iResult;
//int iSendResult;
int recvbuflen = DEFAULT_BUFLEN;

sprintf_s(port_buf, sizeof(port_buf), "%d", port);


ZeroMemory(&hints, sizeof (hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;

// Resolve the local address and port to be used by the server
iResult = getaddrinfo(NULL, port_buf, &hints, &result);
if (iResult != 0) 
{
    printf("getaddrinfo failed: %d\n", iResult);
    return INVALID_SOCKET;
}

// Create a SOCKET for the server to listen for client connections
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET)
{
    printf("***ERROR*** at socket(): %ld\n", WSAGetLastError());
    freeaddrinfo(result);
    return INVALID_SOCKET;
}

// Set up the TCP listening socket
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR)
{
    printf("bind failed: %d\n", WSAGetLastError());
    freeaddrinfo(result);
    closesocket(ListenSocket);
    return INVALID_SOCKET;
}

freeaddrinfo(result);

iResult = listen(ListenSocket, SOMAXCONN);
if ( iResult == SOCKET_ERROR ) 
{
    printf( "Error at bind(): %ld\n", WSAGetLastError() );
    closesocket(ListenSocket);
    return INVALID_SOCKET;
}

return ListenSocket;
 }

Ответы [ 4 ]

1 голос
/ 05 мая 2011

Что?Номер порта, который вы слушаете, не будет тем номером порта, на который ваш удаленный узел будет отправлять вам пакеты.Вам нужно запомнить, с каким номером порта вы приняли соединение.

Попробуйте использовать getpeername, если хотите получить номер порта, который вы и ваш коллега используете.

0 голосов
/ 05 мая 2011

Невозможно, чтобы один сокет прослушивал несколько портов одновременно. Ваша WS_SetUpListener() функция выделяет новый сокет прослушивания каждый раз, когда он вызывается. Вы НЕ должны получать один и тот же дескриптор SOCKET несколько раз, если только вы не закрываете предыдущий сокет прослушивания перед созданием нового сокета прослушивания. Это позволило бы API сокетов повторно использовать предыдущий дескриптор, если он этого хочет.

0 голосов
/ 05 мая 2011

Если вы используете recvfrom() для чтения данных пакета, вы можете извлечь информацию о сокете, которая будет включать информацию о порте. Как вы читаете пакеты в?

РЕДАКТИРОВАТЬ: на самом деле, подождите секунду. Как вы можете получить один и тот же ListeningSocket для обоих? Это невозможно: нельзя подключить один сокет к двум портам.

0 голосов
/ 05 мая 2011

Вы должны использовать процедуру select () и макросы fdset и fdisset.

Дифференцирование между сокетами с помощью Select

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...