Текст полностью прокомментированной программы сервера

#include <vcl.h>

#pragma hdrstop

#pragma argsused

#include <stdio.h>

#include <conio.h>

#include <winsock2.h>

 

#define PORT 666 // порт сервера

#define sHELLO "200 OKnHello, %s [%s] Sailorn"

 

int main(int argc, char* argv[])

{

char buff[1024];

printf("UDP SERVERn");

// Шаг 1 - подключение библиотеки

if (WSAStartup(0x202, (WSADATA *)&buff[0]))

{

printf("WSAStartup error: %dn", WSAGetLastError());

printf ("Press any key for exit...");

getch();

return -1;

}

 

// Шаг 2 - создание сокета

SOCKET my_sock;

my_sock = socket(AF_INET,SOCK_DGRAM,0);

if (my_sock == INVALID_SOCKET)

{

printf("Socket() error: %dn", WSAGetLastError());

WSACleanup();

printf ("Press any key for exit...");

getch();

return -1;

}

 

// Шаг 3 - связывание сокета с локальным адресом

sockaddr_in local_addr;

local_addr.sin_family = AF_INET;

local_addr.sin_addr.s_addr = INADDR_ANY;

local_addr.sin_port = htons(PORT);

 

if (bind(my_sock, (sockaddr *)&local_addr, sizeof(local_addr)))

{

printf("bind error: %dn", WSAGetLastError());

closesocket(my_sock);

WSACleanup();

printf ("Press any key for exit...");

getch();

return -1;

}

 

// Шаг 4 обработка пакетов, присланных клиентами

while (1)

{

sockaddr_in client_addr;

int client_addr_size = sizeof(client_addr);

int bsize = recvfrom(my_sock,&buff[0],sizeof(buff)-1,0,

(sockaddr *)&client_addr, &client_addr_size);

if (bsize == SOCKET_ERROR)

printf("recvfrom() error: %dn", WSAGetLastError());

 

// Определяем IP-адрес клиента и прочие атрибуты

HOSTENT *hst;

hst = gethostbyaddr((char *)&client_addr.sin_addr, 4, AF_INET);

printf("+%s [%s:%d] new DATAGRAM!n",

(hst) ? hst->h_name : "Unknown host",

inet_ntoa(client_addr.sin_addr),

ntohs(client_addr.sin_port));

 

// добавление завершающего нуля

buff[bsize] = 0;

 

// Вывод на экран

printf("C=>S:%sn", &buff[0]);

 

// посылка датаграммы клиенту

sendto(my_sock, &buff[0], bsize, 0,

(sockaddr *)&client_addr, sizeof(client_addr));

}

return 0;

}