- •1. Сокеты, датаграммы и каналы связи
- •2. Инициализация приложения при работе с сокетами и завершение его работы
- •3. Создание и инициализация сокета
- •3.1. Создание сокета
- •3.2. Удаление сокета
- •3.3. Параметры сокета
- •3.4. Привязка адреса к сокету
- •3.5. Создание канала связи
- •3.5.1.Сторона сервера
- •3.5.1. Сторона клиента
- •3.5.3. Передача и прием данных
- •4. Решения при работе с сокетами
- •5. Порядок выполнения работы
- •6. Контрольные вопросы
- •Приложения
- •1. Коды ошибок различных функций при работе с сокетами
- •2. Сервер сокетов с оконным интерфейсом (протокол tcp/ip).
- •3. Клиент сокетов с оконным интерфейсом (протокол tcp/ip).
- •4. Сервер сокетов с оконным интерфейсом (протокол udp).
- •5. Клиент сокетов с оконным интерфейсом (протокол udp).
- •6. Сервер неблокирующих сокетов с использованием события wsaevent (протокол tcp/ip)
- •7. Клиент неблокирующих сокетов с использованием события wsaevent (протокол tcp/ip)
- •8. Сервер неблокирующих сокетов с использованием функции select
- •9.Клиент неблокирующих сокетов с использованием функции select
- •10. Сервер блокируюющих сокетов (протокол tcp/ip)
- •11. Клиент блокируюющих сокетов (протокол tcp/ip)
9.Клиент неблокирующих сокетов с использованием функции select
#include <windows.h>
#include <winsock.h>
#include <conio.h>
#include <stdio.h>
#define SERV_PORT 5000
// Сокет клиента
SOCKET srv_socket;
// Локальный сокет
SOCKADDR_IN local_sin;
// Адрес сервера
SOCKADDR_IN dest_sin;
int main ()
{
int rc;
WSADATA WSAData;
char szTemp[128];
// Инициализация и проверка версии Windows Sockets
rc = WSAStartup(MAKEWORD(1, 1), &WSAData);
if(rc != 0)
{
//MessageBox(NULL, "WSAStartup Error", "Error", MB_OK);
printf("\nWSAStartup Error\n");
getch();
return FALSE;
}
// Отображаем описание и версию системы Windows Sockets
printf("\nServer initialization...\n");
wsprintf(szTemp, "Server use %s %s",
WSAData.szDescription,WSAData.szSystemStatus);
printf("%s\n",szTemp);
PHOSTENT phe;
// Создаем сокет
srv_socket = socket(AF_INET, SOCK_STREAM, 0);
if(srv_socket == INVALID_SOCKET)
{
//MessageBox(NULL, "socket Error", "Error", MB_OK);
printf("\nsocket Error \n");
getch();
return;
}
printf("\nSocket is created.\n");
dest_sin.sin_family = AF_INET;
dest_sin.sin_addr.s_addr = INADDR_ANY;
dest_sin.sin_port = 0;
// Связываем адрес IP с сокетом
if(bind(srv_socket, (LPSOCKADDR)&dest_sin,
sizeof(dest_sin)) == SOCKET_ERROR)
{
// При ошибке закрываем сокет
closesocket(srv_socket);
printf("\nbind Error.\n");
getch();
//MessageBox(NULL, "bind Error", "Error", MB_OK);
return;
}
printf("\nSocket is binded.\n");
// Устанавливаем адрес IP и номер порта
dest_sin.sin_family = AF_INET;
// Определяем адрес узла
printf("\nGetting remote host adress.\n");
// Адрес локального узла для отладки
phe = gethostbyname("localhost");
// Адрес удаленного узла
//phe = gethostbyname("maxsinev");
if(phe == NULL)
{
closesocket(srv_socket);
printf("\ngethostbyname Error\n");
getch();
//MessageBox(NULL, "gethostbyname Error", "Error", MB_OK);
return;
}
// Копируем адрес узла
memcpy((char FAR *)&(dest_sin.sin_addr), phe->h_addr,
phe->h_length);
// Другой способ указания адреса узла
// dest_sin.sin_addr.s_addr = inet_addr("200.200.200.201");
// Копируем номер порта
dest_sin.sin_port = htons(SERV_PORT);
getch();
// Устанавливаем соединение
printf("\nConnecting to remote host ...\n");
if(connect(srv_socket, (PSOCKADDR)&dest_sin,
sizeof(dest_sin)) < 0)
{
closesocket(srv_socket);
printf("\n connect Error\n");
//MessageBox(NULL, "connect Error", "Error", MB_OK);
return;
}
char szBuf[80];
lstrcpy(szBuf, "Test string");
// Посылаем сообщение
printf("\nSending message to server ... \n");
send(srv_socket, szBuf, lstrlen(szBuf), 0);
//getch();
printf("\nReceiving message from server ...\n");
rc = recv((SOCKET)srv_socket, szTemp, 256, 0);
if(rc)
{
szTemp[rc] = '\0';
printf("\nMessage from server: %s\n",szTemp);
getch();
//MessageBox(NULL, szTemp, "Reсeived data", MB_OK);
}
printf("\nCleanup ...");
// Освобождение ресурсов, полученных для
// работы с Windows Sockets
WSACleanup();
return;
}
Приложение 10