我对 C++ 很陌生,在设置简单的 UDP 服务器时遇到了一些麻烦。我想要我的代码做的就是接收一条消息并将其打印到控制台。
经过大量研究后,我发现我需要使用 WSAStartup 才能使套接字正常工作,但我不确定它是如何工作的以及将 WSACleanup 放在哪里。如果我在创建套接字后放置 WSACleanup,我会在执行“绑定”方法时在控制台中返回错误代码“10093”。如果不使用清理,则程序运行并且在控制台中根本不显示任何内容。
我在调试模式下浏览了代码,发现它似乎运行成功,因为它会挂在“recvfrom”行上,直到我使用测试 UDP java 客户端发送消息。我只是想知道为什么控制台上没有打印任何内容,或者我是否遗漏了某些内容。
任何帮助将非常感激。我也在为我的 IDE 和 MinGW 编译器使用 netbeans。
这是我的代码:
#include <stdio.h>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#define PORT 9760
#define BUFSIZE 1024
void startup()
{
WORD wVersionRequested;
WSADATA wsaData;
int start;
wVersionRequested = MAKEWORD(2, 2);
start = WSAStartup(wVersionRequested, &wsaData);
if(start!=0){
printf("This version is not supported! - %d \n", WSAGetLastError());
}
else{
printf("Good - Everything fine!\n");
}
}
void Server()
{
startup();
struct sockaddr_in myaddr;
struct sockaddr_in remaddr;
socklen_t addrlen = sizeof(remaddr);
int recvlen;
SOCKET fd;
char buf[BUFSIZE];
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("cannot create socket\n");
return;
}
else {
printf("socket created \n");
}
memset((char *)&myaddr, 0, sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
myaddr.sin_port = htons(PORT);
int bindVal = bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr));
if (bindVal < 0) {
printf("socket error: %d, %s \n", errno, strerror(errno));
perror("bind failed");
printf("bind wsaerr: %d \n", WSAGetLastError());
WSACleanup();
return;
}
for (;;) {
//printf("waiting on port %d\n", PORT);
recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen);
//printf("received %d bytes\n", recvlen);
if (recvlen > 0) {
buf[recvlen] = 0;
printf("received message: \"%s\"\n", buf);
}
//WSACleanup();
}
}
int main(int argc, char** argv) {
Server();
WSACleanup();
return 0;
}