Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
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; просмотров: 292; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.008 с.) |