Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Tcp 0 0 localhost:58717 localhost:30013 ESTABLISHED 2960/tcpclient ⇐ ПредыдущаяСтр 2 из 2
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; просмотров: 197; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.44.23 (0.02 с.) |