Во всем остальном обе пары функций полностью идентичны

Все четыре функции при возникновении ошибки возвращают значение SOCKET_ERROR = -1.

Шаг шестой, последний – для закрытия соединения и уничтожения сокета предназначена функция "int closesocket (SOCKET s)", которая в случае удачного завершения операции возвращает нулевое значение.

Перед выходом из программы, необходимо вызвать функцию "int WSACleanup (void)" для деинициализации библиотеки WINSOCK и освобождения используемых этим приложением ресурсов. Внимание: завершение процесса функцией ExitProcess автоматически не освобождает ресурсы сокетов.

Задания к лабораторной работе № 2:

Все программы выполняются на любом языке программирования, используются только функции Windows API. Для каждого варианта должно быть реализовано две версии программы: одна работающая посредством протокола TCP, вторая – UDP.

Написать программу, реализующую следующие функции:

Вариант 1: Программа представляет простейший «чат» (от англ. chat), позволяющий обмениваться текстовыми сообщениями между двумя компьютерами.

Вариант 2: Программа позволяет копировать бинарные файлы с одного компьютера на другой.

Вариант 3: Программа измеряет скорость передачи информации по протоколам TCP и UDP, а так же количество потерянных (искаженных) пакетов. Трафик генерируется псевдослучайным образом (т.е. генерируется псевдослучайная последовательность данных, отсылается на другой компьютер и там сравнивается с эталоном).

Вариант 4: Программа удаленного рисования. На первом компьютере пользователь может рисовать кривые мышкой на «холсте». На втором на таком же холсте рисунок повторяется в реальном времени.

Пример программы реализации сервера DayTime:

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#define fatal(x) { perror(x); exit(1); }

main()

{

int s, c, sz;

struct sockaddr_in ssa, csa;

struct sockaddr *sp, *cp;

char *tstr, node[128], service[16];

time_t itime;

sp = (struct sockaddr *)&ssa;

cp = (struct sockaddr *)&csa;

/* Создаём сокет */

s = socket(AF_INET, SOCK_STREAM, 0);

if (s == -1)

fatal("Невозможно создать сокет");

/* Занимаем порт 13 */

ssa.sin_family = AF_INET;

ssa.sin_port = htons(13);

ssa.sin_addr.s_addr = INADDR_ANY;

if (bind(s, sp, sizeof(ssa)) == -1)

fatal("Невозможно занять порт");

/*

* Переводим сокет в режим ожидания запросов

* на установление соединения

*/

if (listen(s, 0) == -1)

fatal("Ошибка при выполнении listen");

while (1) {

/* Принимаем соединение */

sz = sizeof(csa);

if ((c = accept(s, cp, &sz)) == -1)

fatal("Ошибка при выполнении accept");

/* Получаем строку, содержащую дату и время */

itime = time(NULL);

tstr = ctime(&itime);

/* Выводим время поступления запроса */

printf("%s\tполучен запрос от ", tstr);

/* Выводим информацию о клиенте */

if (getnameinfo(cp, sz, node,

128, service, 16, 0) == 0)

printf("%s:%s\n", node, service);

else

printf("%s:%d\n", inet_ntoa(csa.sin_addr),

ntohs(csa.sin_port));

/* Отправляем дату и время клиенту */

send(c, tstr, 25, 0);

/* Закрываем соединение */

close(c);

}

}

Наши рекомендации