Попытка создать UDP-сервер

0

Я пытаюсь создать UDP-сервер, хотя даже клиент не подключается к нему, он получает соединение... (Он много пишет в консоли - New Connection, поэтому я предполагаю, что он неожиданно получает новое соединение...)

#include <iostream>
#include <string>
#include <WinSock2.h>
#include <ws2tcpip.h>
#include <Windows.h>

#pragma comment(lib, "ws2_32.lib")

SOCKET ServerOn()
{
SOCKET ListenSocket;
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
{
    exit(0);
}

// Create a SOCKET for listening for
// incoming connection requests.
ListenSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ListenSocket == INVALID_SOCKET) 
{
    WSACleanup();
    exit(1);
}

// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("0.0.0.0");
service.sin_port = htons(2583);

if (bind(ListenSocket,(SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR) 
{
    closesocket(ListenSocket);
    WSACleanup();
    exit(2);
}

return ListenSocket;
}

int main()
{
SOCKET ListenSocket = ServerOn();
SOCKET ClientSocket;

sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("10.0.0.2");
service.sin_port = htons(2583);

while(true)
{
    if (ClientSocket = accept(ListenSocket, (SOCKADDR*)&service, NULL))
    {
            std::cout << "New Connection!" << std::endl;
    }
}
}

Почему это связано, я ничего не бегал? Может быть, что-то еще пытается подключиться к моему серверу?

Благодарю!

Теги:
sockets
winsock
udp

1 ответ

1
Лучший ответ

Две вещи: я не думаю, что IP-адрес вашего сервера может быть 0.0.0.0, но вместо этого 10.0.0.2; а также UDP не поддерживает концепцию "принять". Есть только пакеты, и вы можете либо привязать сокет к порту, либо получить пакеты с определенного IP (с recvfrom), либо вы можете получать пакеты от кого-либо, с recv. Последнее будет полезно в случае сервера. Обратите внимание, что вам необходимо вручную отслеживать каждый подключенный клиент с помощью структуры sockaddr_in.

  • 0
    Вы должны использовать recvfrom ( linux.die.net/man/2/recvmsg ) для UDP, recv обычно только для TCP

Ещё вопросы

Сообщество Overcoder
Наверх
Меню