C ++ пустая консоль после WSAStartup

Я очень плохо знаком с C ++ и у меня возникли проблемы с настройкой простого сервера UDP. Все, что я хочу, чтобы мой код — это получить сообщение и распечатать его на консоли.

После долгих исследований я обнаружил, что мне нужно использовать WSAStartup, чтобы заставить сокеты работать правильно, но я не уверен, как это работает и куда поместить WSACleanup.
Если я добавлю WSACleanup после того, как сокет будет создан, я получу код ошибки «10093» в консоли при выполнении метода «bind». Если не использовать очистку, то программа запускается и вообще ничего не показывает в консоли.

Я просмотрел код в режиме отладки и обнаружил, что он работает успешно, так как он будет зависать в строке «recvfrom» до тех пор, пока я не отправлю сообщение с помощью тестового Java-клиента UDP. Мне просто интересно, почему на консоль ничего не выводится или что-то не хватает.

Любая помощь приветствуется. Я использую NetBeans для своего IDE и MinGW компилятора.

Вот мой код:

#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;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]