2012-05-31 2 views
1

Ниже вы можете увидеть мой код, который реализует довольно простой UDP-отправитель в C++ с помощью Winsock. Дело в том, что независимо от того, сколько раз я запускаю код, сокет (listenSocket) привязывается к другому UDP-порту. Есть ли какая-то конкретная причина для этого? Я ошибаюсь в своем коде?winsock - гнездо 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; 
} 

EDIT: Может быть, я не так ясно. Что я делаю с этим кодом, это отправить некоторые данные на удаленный компьютер. Но требуется, чтобы сегменты UDP, как представляется, были созданы из определенного порта. Как это может быть сделано? Это неправильно, что я здесь делаю? Теперь, когда я думаю об этом, я думаю, что это действительно так. У SendSocket и ListenSocket нет никакого соединения, правильно? Итак, как я могу сделать так, чтобы сегменты UDP появлялись из определенного UDP-порта? Благодаря!

ответ

2

Вы не звоните bind() по адресу SendSocket перед отправкой данных с ним, поэтому WinSock может связывать этот сокет с любым случайным локальным IP/портом, в котором он нуждается. Если вам нужно отправлять данные с определенным IP-портом источника каждый раз, вы должны сначала указать bind() на этот IP-порт. Если этот локальный IP/порт является той же парой, вы связываете ListenSocket с, то вам не нужно использовать два отдельных сокета для начала. Вы можете отправлять данные с тем же сокетом, который прослушивает входящие данные.

+0

Спасибо за это разъяснение, я был действительно смущен (хотя это так просто). Я не понял, что сокет может быть привязан к локальному ip/port независимо от того, прослушиваем ли мы входящие данные или передаем их из этого сокета. – nickagian

Смежные вопросы