Tcp 0 0 localhost:58717 localhost:30013 ESTABLISHED 2960/tcpclient 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Tcp 0 0 localhost:58717 localhost:30013 ESTABLISHED 2960/tcpclient



Tcp 2 0 localhost:30013 localhost:58718 ESTABLISHED -

Tcp 0 0 localhost:58718 localhost:30013 ESTABLISHED 3070/tcpclient

tcp6 0 0 ip6-localhost:ipp [::]:* LISTEN -

tcp6 1 0 ip6-localhost:34759 ip6-localhost:ipp CLOSE_WAIT -

udp 0 0 *:mdns *:* -

udp 0 0 *:52615 *:* -

udp 0 0 *:36516 *:* -

udp 0 0 vadim-VirtualBox:domain *:* -

udp 0 0 *:bootpc *:* -

udp 0 0 *:ipp *:* -

udp6 0 0 [::]:35869 [::]:* -

udp6 0 0 [::]:mdns [::]:* -

udp6 0 0 [::]:52883 [::]:* -

Активные сокеты домена UNIX (servers and established)

Proto RefCnt Flags Type State I-Node PID/Program name Путь

unix 2 [ ACC ] STREAM LISTENING 12130 1463/gnome-session @/tmp/.ICE-unix/1463

unix 2 [ ACC ] STREAM LISTENING 11255 - @/tmp/.X11-unix/X0

unix 2 [ ACC ] STREAM LISTENING 12850 1555/pulseaudio /run/user/1000/pulse/native

unix 2 [ ACC ] STREAM LISTENING 14131 - /var/run/cups/cups.sock

 

2.3

/* tcpserver.c */

#include <sys/socket.h>

 

#include <sys/types.h>

 

#include <stdio.h>

 

#include <netinet/in.h>

#include <arpa/inet.h>

 

#define SERV_PORT 30013

 

#define BUFSIZE 100

 

#define SADDR struct sockaddr

 

#define SIZE sizeof(struct sockaddr_in)

 

int main() {

 

int lfd, cfd;

 

int nread, clilen;

 

char buf[BUFSIZE], ipadr[16];

 

struct sockaddr_in servaddr;

 

struct sockaddr_in cliaddr;

 

if ((lfd = socket(AF_INET, SOCK_STREAM, 0))<0)

 

{perror("socket"); exit(1);}

 

memset(&servaddr, 0, SIZE);

 

servaddr.sin_family = AF_INET;

 

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

 

servaddr.sin_port = htons(SERV_PORT);

 

if (bind(lfd, (SADDR *) &servaddr, SIZE)<0)

 

{perror("bind"); exit(1);}

 

if (listen(lfd, 5) < 0) {perror("listen"); exit(1);}

 

for(;;){

 

clilen =SIZE;

 

if ((cfd = accept(lfd, (SADDR *)&cliaddr, &clilen)) < 0)

 

{perror("accept"); exit(1);}

 

printf("connection established\n");

 

while ((nread = read(cfd, buf, BUFSIZE))> 0) {

sleep(1);

printf("%s: %d\n", inet_ntop(AF_INET, (void *)&cliaddr.sin_addr.s_addr, ipadr,16), ntohs(cliaddr.sin_port));

 

write(1, &buf, nread);

}

 

if (nread == -1){perror("read"); exit(1);}

 

close(cfd);

 

}

 

}

 

 

/* tcpclient.c */

#include <sys/socket.h>

 

#include <sys/types.h>

 

#include <stdio.h>

 

#include <netinet/in.h>

 

#define BUFSIZE 100

 

#define SADDR struct sockaddr

 

#define SIZE sizeof(struct sockaddr_in)

 

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

 

int fd;

 

int nread;

 

char buf[BUFSIZE];

 

struct sockaddr_in servaddr;

 

if (argc < 3) {printf("Too few arguments \n"); exit(1);}

 

if ((fd = socket(AF_INET, SOCK_STREAM, 0))<0)

 

{perror("socket creating"); exit(1);}

 

memset(&servaddr, 0, SIZE);

 

servaddr.sin_family = AF_INET;

 

if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)

 

{perror("bad address"); exit(1);}

 

servaddr.sin_port = htons(atoi(argv[2]));

 

if (connect(fd, (SADDR *)&servaddr, SIZE)<0)

 

{perror("connect"); exit(1);}

 

write(1, "Input message to send\n", 22);

 

while ((nread = read(0, buf, BUFSIZE)) > 0)

 

if (write(fd, buf, nread)<0)

 

{perror("write"); exit(1);}

 

close(fd);

 

exit(0);

 

}

 

3.3

 

/* tcpserver.c */

#include <sys/socket.h>

#include <sys/types.h>

#include <stdio.h>

#include <netinet/in.h>

 

#define SERV_PORT 30016

#define BUFSIZE 100

#define SADDR struct sockaddr

#define SIZE sizeof(struct sockaddr_in)

 

int main() {

int lfd, cfd;

int nread, clilen;

char buf[BUFSIZE];

struct sockaddr_in servaddr;

struct sockaddr_in cliaddr;

 

if ((lfd = socket(AF_INET, SOCK_STREAM, 0))<0)

{perror("socket"); exit(1);}

 

memset(&servaddr, 0, SIZE);

servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port = htons(SERV_PORT);

 

if (bind(lfd, (SADDR *) &servaddr, SIZE)<0)

{perror("bind"); exit(1);}

 

if (listen(lfd, 5) < 0) {perror("listen"); exit(1);}

 

for(;;){

clilen =SIZE;

 

if ((cfd = accept(lfd, (SADDR *)&cliaddr, &clilen)) < 0)

{perror("accept"); exit(1);}

 

if (fork()==0)

{

printf("connection established\n");

 

while ((nread = read(cfd, buf, BUFSIZE))> 0)

write(1, &buf, nread);

if (nread == -1){perror("read"); exit(1);}

printf("client gone\n");

close(cfd);

 

return 0;

}

}

}

Вопросы

Со́кеты — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения. Это структура данных, используемая как оконечная точка взаимодействия для IPC. Сокет является развитием механизма каналов.

Какие типы сокетов используются в ОС UNIX?

Сокеты UDP и TCP

Каково назначение и параметры системного вызова socket()? connect()?

Сокет создается при помощи системного вызова socket.

#include <sys/types.h>

#include <sys/socket.h>

int socket(int domain,int type,int protocol);

Здесь domain – (IF_INET для домена Интернет, AF_UNIX Для домена UNIX), type – тип обслуживания (SOCK_STREAM для TCP, SOCK_DGRAM для UDP), protocol – номер применяемого протокола или 0. Нулевое значение параметра указывает, что должен применяться протокол, предусмотренный по умолчанию для данного семейства адресов и типа обслуживания. Функция socket в случае успешного выполнения возвращает дескриптор сокета, в случае ошибки возвращает -1

 

Функция connect соединение с сервером.

#include <sys/types.h>

#include <sys/socket.h>

int connect(int sd, struct sockaddr *addr, int addrlen);

Здесь sd – дескриптор сокета; addr – указатель на структуру, в которую записан адрес оконечной точки, соответствующей удаленному компьютеру; addrlen – длина второго параметра. Функция connect возвращает 0 в случае успешного выполнения и -1 при ошибке. Функция connect используется клиентом. Она инициирует соединение TCP и возвращает код возврата, говорящий об успехе или неуспехе.

 

Каково назначение и параметры системного вызова bind()? Обязательно ли его вызывать для сервера? Для клиента? Почему?

Функция bind привязывает локальный сокет к адресу, или указывает адрес локальной оконечной точки.

#include <sys/types.h>

#include <sys/socket.h>

int bind(int sockfd, struct sockaddr *lockaddr, int addrlen);

Здесь sockfd – дескриптор сокета, созданный в результате вызова функции socket; lockaddr – указатель на структуру адреса сокета, в которой указаны IP-адрес и номер порта; addrlen – размер структуры адреса сокета. Функция bind возвращает 0 в случае успешного выполнения и -1 при ошибке. Функция "привязывает" сокет к локальному IP-адресу и локальному порту.

На стороне клиента этот вызов делать не обязательно – при вызове connect ядро автоматически сделает необходимое связывание. На стороне сервера обычно явно вызывают bind перед тем, как начать принимать соединения или производить обмен данными.

Каково назначение и параметры вызова accept()? Какой результат возвращает accept()?

Функция accept используется процессом-сервером.

#include <sys/types.h>

#include <sys/socket.h>

int accept(int sd, struct sockaddr *addr,int *addrlen);

Здесь sd – дескриптор сокета; addr – указатель на структуру, в которую функция accept записывает IP-адрес и номер порта протокола удаленного компьютера; addrlen – указатель на целое число, в которое перед вызовом функции записывается размер структуры *addr, а после возврата из функции содержится число байтов, записанных фуекцией в эту структуру. Функция accept возвращает неотрицательный дескриптор сокета в случае успешного выполнения и -1 при ошибке.

Функция accept 1) извлекает из очереди сокета с дескрипторм sd следующий запрос на установление соединения; 2) создает новый сокет для нового запроса и возвращает дескриптор этого сокета. Этот сокет используется только для нового соединения. Старый сокет служит для приема новых запросов на соединения. Старый сокет sd называют прослушивающим, новый сокет – присоединенным.

 

Какова последовательность действий, выполняемых сервером в udpserver.c и tcpserver.c?

 

Какова последовательность действий, выполняемых клиентом в udpclient.c и tcpclient.c?

 

Что произойдет, если в параллельном сервере TCP не закрывать в дочернем сервере прослушиваемый сокет, а в родительском сервере – присоединенный сокет? Почему?

 



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 194; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.136.97.64 (0.015 с.)