Во всем остальном обе пары функций полностью идентичны
Все четыре функции при возникновении ошибки возвращают значение 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);
}
}