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

// пример простого UDP-клиента

#include <vcl.h>

#pragma hdrstop

#pragma argsused

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <winsock2.h>

#include <windows.h>

#include <math.hpp>

#include "winbase.h"

 

#define PORT 666

 

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

{

char* SERVERADDR="127.0.0.1";

char buff[10 * 1014];

LARGE_INTEGER m_sw_freq,counter1,counter2;

QueryPerformanceFrequency(&m_sw_freq);//инициализация таймера

printf("UDP CLIENTnType quit to quitn");

 

// Шаг 1 - иницилизация библиотеки Winsocks

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

{

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

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

getch();

return -1;

}

 

// Шаг 2 - открытие сокета

SOCKET my_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (my_sock == INVALID_SOCKET)

{

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

WSACleanup();

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

getch();

return -1;

}

 

// Шаг 3 - обмен сообщений с сервером

HOSTENT *hst;

sockaddr_in dest_addr;

 

dest_addr.sin_family = AF_INET;

dest_addr.sin_port = htons(PORT);

 

// ввод IP адресса сервера

printf("Input Server UDP addr:");

gets(SERVERADDR);

// определение IP-адреса узла

if (inet_addr(SERVERADDR) != INADDR_NONE)

dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);

else

{

if (hst = gethostbyname(SERVERADDR))

dest_addr.sin_addr.s_addr = ((unsigned long **) hst->h_addr_list)[0][0];

else

{

printf("Unknown host: %dn", WSAGetLastError());

closesocket(my_sock);

WSACleanup();

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

getch();

return -1;

}

}

while (1)

{

// чтение сообщения с клавиатуры

printf("S<=C: "); fgets(&buff[0], sizeof(buff) - 1, stdin);

if (!strcmp(&buff[0], "quitn")) break;

QueryPerformanceCounter(&counter1);//чтение начального системного времени

// Передача сообщений на сервер

sendto(my_sock, &buff[0], strlen(&buff[0]), 0,

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

 

// Прием сообщения с сервера

sockaddr_in server_addr;

int server_addr_size = sizeof(server_addr);

 

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

(sockaddr *)&server_addr, &server_addr_size);

QueryPerformanceCounter(&counter2);//чтение конечного системного времени

 

if (n == SOCKET_ERROR)

{

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

closesocket(my_sock);

WSACleanup();

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

getch();

return -1;

}

 

buff[n] = 0;

 

// Вывод принятого с сервера сообщения на экран

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

printf("time request: %s msn",

FloatToStr(RoundTo(double(counter2.QuadPart-counter1.QuadPart)*1000/double(m_sw_freq.QuadPart),-3)));

}

 

// Шаг последний - выход

closesocket(my_sock);

WSACleanup();

return 0;

}