Я увидел что-то, что было для меня красным флагом, когда я запустил это:
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
?