Пример. Работа с локальными сокетами

Схема работы с сокетами без установления соединения

Схема работы с сокетами с установлением соединения

Мы рассмотрели все основные функции работы с сокетами. Обобщая изложенное, можно изобразить общую схему работы с сокетами с установлением соединения в следующем виде

Общая схема работы с сокетами без предварительного установления соединения проще

Ниже приведена небольшая программа, которая в зависимости от параметра командной строки исполняет роль клиента или сервера. Клиент и сервер устанавливают соединение с использованием датаграммных сокетов. Клиент читает строку со стандартного ввода и пересылает серверу; сервер посылает ответ в зависимости от того, какова была строка. При введении строки «quit» и клиент, и сервер завершаются.

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <stdio.h>

#include <string.h>

#define SADDRESS "mysocket"

#define CADDRESS "clientsocket"

#define BUFLEN 40

int main (int argc, char **argv)

{ struct sockaddr_un party_addr, own_addr;

int sockfd;

int is_server;

char buf[BUFLEN];

int party_len;

int quitting;

if (argc!= 2) {

printf("Usage: %s client|server.\n", argv[0]);

return 0;

}

quitting = 1;

/* определяем, кто мы: клиент или сервер*/

is_server =!strcmp(argv[1], "server");

memset(&own_addr, 0, sizeof(own_addr));

own_addr.sun_family = AF_UNIX;

strcpy(own_addr.sun_path, is_server? SADDRESS: CADDRESS);

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

if ((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)

{

printf("can't create socket\n");

return 0;

}

/* связываем сокет */

unlink(own_addr.sun_path);

if (bind(sockfd, (struct sockaddr *) &own_addr, sizeof(own_addr.sun_family)+ strlen(own_addr.sun_path)) < 0)

{

printf("can't bind socket!");

return 0;

}

if (!is_server)

{

/* это – клиент */

memset(&party_addr, 0, sizeof(party_addr));

party_addr.sun_family = AF_UNIX;

strcpy(party_addr.sun_path, SADDRESS);

printf("type the string: ");

while (gets(buf)) {

/* не пора ли выходить? */

quitting = (!strcmp(buf, "quit"));

/* считали строку и передаем ее серверу */

if (sendto(sockfd, buf, strlen(buf) + 1, 0, (struct sockaddr *) &party_addr, sizeof(party_addr.sun_family) +

strlen(SADDRESS))!= strlen(buf) + 1)

{

printf("client: error writing socket!\n");

return 0;

}

/*получаем ответ и выводим его на печать*/

if (recvfrom(sockfd, buf, BUFLEN, 0, NULL, 0) < 0)

{

printf("client: error reading socket!\n");

return 0;

}

printf("client: server answered: %s\n", buf);

if (quitting) break;

printf("type the string: ");

} // while

close(sockfd);

return 0;

} // if (!is_server)

/* это – сервер */

while (1)

{

/* получаем строку от клиента и выводим на печать */

party_len = sizeof(party_addr);

if (recvfrom(sockfd, buf, BUFLEN, 0,(struct sockaddr *) &party_addr, &party_len) < 0)

{

printf("server: error reading socket!");

return 0;

}

printf("server: received from client: %s \n", buf);

/* не пора ли выходить? */

quitting = (!strcmp(buf, "quit"));

if (quitting)

strcpy(buf, "quitting now!");

else

if (!strcmp(buf, "ping!"))

strcpy(buf, "pong!");

else

strcpy(buf, "wrong string!");

/* посылаем ответ */

if (sendto(sockfd, buf, strlen(buf) + 1, 0, (struct sockaddr *) &party_addr, party_len)!= strlen(buf)+1)

{

printf("server: error writing socket!\n");

return 0;

}

if (quitting) break;

} // while

close(sockfd);

return 0;

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: