Сетевой код Windows winsock: чего мне не хватает? - PullRequest
0 голосов
/ 21 марта 2011

Я увидел что-то, что было для меня красным флагом, когда я запустил это:

nc -l -u -p 1500

Эта команда netcat заставляет прослушивать пакеты с UDP-порта 1500. Как только я запустил это в командной строке Windows,Я сразу получил всплывающее сообщение Windows Firewall has disabled features blah blah blah.К сожалению, я понял, что мой собственный код UDP не сработал, поэтому я должен что-то делать не так.Вот текущая итерация моего кода winsock на тот случай, если он уместен:

#ifdef WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#endif
#include <sys/types.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#include <TinyThread++/tinythread.h>
#include <iostream>

#ifdef WIN32
class WSA {
public:
    WSA() {
        WSADATA wsaData;
        WORD wVersionRequested = MAKEWORD(2,0);
        int err = WSAStartup(wVersionRequested, &wsaData);
        if (err != 0) {
            PRINT("WSAStartup failed with an error: "); PRINT_INT(err);
            exit(-1);
        }
    }
    ~WSA() {
        WSACleanup();
    }
};
static WSA wsa_placeholder;
static int UDPSocket = -1;
static int listen_port = -1;

int initUDPSocket(int port) {
    listen_port = port;
    UDPSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    ASSERT(UDPSocket != -1);
    sockaddr_in myaddr; 
    memset(&myaddr,0,sizeof(myaddr)); // clear it
    myaddr.sin_family = AF_INET;
    myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    ASSERT(listen_port > 0);
    myaddr.sin_port = htons(listen_port);
    ASSERT(bind(UDPSocket, (sockaddr *)&myaddr, sizeof(myaddr))!=-1);
    return UDPSocket;
}


void closeUDPSocket() {
    closesocket(UDPSocket);
    UDPSocket = -1;
}

using namespace std;
using namespace tthread;
void UDPListenThread (void *arg) {
    cout << "UDP Listening thread ID: " << this_thread::get_id() << endl;
    while (1) {
        sockaddr_in from;
        int fromlen = sizeof(from);
        size_t len;
        char buf[2048];
        len = recvfrom(UDPSocket, buf, 2048, 0, (sockaddr*)&from, &fromlen);
        printf("Received packet from %s:%d, length %u\n",inet_ntoa(from.sin_addr),
                ntohs(from.sin_port),len);
        hexdump(buf,len);
        if (len == 2 && buf[0] == 'q' && buf[1] == 0x0a) {
            break;
        }
    }
    cout << "Received a quit packet. exiting routine (thread)." << endl;
}
thread startUDPListenThread() {
    cout << "Main thread ID: " << this_thread::get_id() << endl;
    return thread(UDPListenThread,0);
}

Если я использую netcat для отправки пакетов UDP с той же машины в мою программу, он получает их.Но он не получает пакеты из интернета.Кроме того, почему брандмауэр Windows, похоже, не возражал?Есть ли что-то еще, что мне нужно сделать, как WSAStartup?

1 Ответ

1 голос
/ 21 марта 2011

Вы привязываетесь к localhost, брандмауэр Windows имеет отдельные конфигурации для Private, Public и Domain, которые, по-видимому, сопоставляются с intranet & localhost, Internet и Kerberos аутентифицированным доменом.

Bind to 0.0.0.0 (INADDR_ANY) для прослушивания на всех интерфейсах.

...