Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 22.11.2014
Сообщений: 170

Сервер блокируется и не дает продолжать работу

14.12.2017, 15:32. Показов 799. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Блокируется функцией accept(вроде бы)
Программа - сервер и клиент для обмена сообщениями.
Как решить проблему?
server.c
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<errno.h>
#include <string.h>
#include<unistd.h>
#include<stdlib.h>
void main(int argc,char **argv)
{
    int sockfd,newsockfd1,newsockfd2;
    int n,k,m;
    int client;
    char line1[1000], line2[1000];
    struct sockaddr_in servaddr,cliaddr;
 
    if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){ 
        perror(NULL);
        exit(1);
    }
 
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port = htons(51000);
    servaddr.sin_addr.s_addr =htonl(INADDR_ANY);
 
    if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }
 
    if(listen(sockfd,8)<0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }
 
    while(1){{
            client=sizeof(cliaddr);
 
             if((newsockfd1=accept(sockfd,(struct sockaddr*)&cliaddr,&client))<0){
            perror(NULL);
                  close(sockfd);
                   exit(1);
             }
 
             if((newsockfd2=accept(sockfd,(struct sockaddr*)&cliaddr,&client))<0){
             perror(NULL);
                 close(sockfd);
                 exit(1);
             }
 
             if((n=read(newsockfd1,line1,999))>0){
                if((n=write(newsockfd2,line1,strlen(line2)+1))<0)
                   {
                       perror(NULL);
                       close(sockfd);
                      close(newsockfd1);
                      close(newsockfd2);
                     exit(1);
                 }}
 
                 if((n=read(newsockfd2,line2,999))>0){
                  if((n=write(newsockfd1,line2,strlen(line2)+1))<0)
                  {
                  perror(NULL);
                  close(sockfd);
                  close(newsockfd1);
                  close(newsockfd2);
                  exit(1);
                   }}
            }
                     
                    if(n<0){
                    perror(NULL);
                    close(sockfd);
                    close(newsockfd1);
                    close(newsockfd2);
                    exit(1);
                    }
                //close(newsockfd1);
                //close(newsockfd2);
            }
}
client.c
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include <string.h>
#include<unistd.h>
void main(int argc,char **argv)
{
    int sockfd;
    int n;
    int i;
    char sendline[1000],recvline[1000];
    struct sockaddr_in servaddr;
 
    if(argc!=2){
        printf("Usage:a.out <IP address>\n");
        exit(1);
    }
 
    bzero(sendline,1000);
    bzero(recvline,1000);
 
    if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){//AF or PF
        perror(NULL);
        exit(1);
    }
 
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port = htons(51000);
 
    if(inet_aton(argv[1],&servaddr.sin_addr) ==0){
        printf("INvalid IP address\n");
        close(sockfd);
        exit(1);
    }
 
    if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }
 
    for(i=0;i<3;i++){
        printf("Message:\n");
        fflush(stdin);
        fgets(sendline,1000,stdin);
        if((n=write(sockfd,sendline,strlen(sendline)+1))<0){
            perror("Can\'t write \n");
            close(sockfd);
            exit(1);
        }
        if((n=read(sockfd,recvline,999))<0){
            perror("Can\'t read \n");
            close(sockfd);
            exit(1);
        }
        printf("%s",recvline);
        bzero(sendline,1000);
        bzero(recvline,1000);
    }
    close(sockfd);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.12.2017, 15:32
Ответы с готовыми решениями:

Продолжать ли работу с доменом?
Зарегистрировал домен, после чего в течении месяца ничего на нем не публиковал. Домен попал в индекс Google. Может ли быть такое, что за...

Продолжать работу после закрытия браузера
В общем такой вопрос, допустим в Web приложении есть &quot;задачи&quot;, пользователь создаёт, запускает и ждёт завершения, как сделать, чтобы задачи...

Сервер 2008R2- даёт IP 192.168.0.(2-200), и даёт неправильные DNS сервера
Сервер 2008 R2- даёт IP adress например 192.168.0.(2-200), и над значоком интернета восклицательный значок есть без доступа к интернету...

2
6 / 6 / 2
Регистрация: 09.02.2016
Сообщений: 138
18.12.2017, 22:17
accept сама по себе блокирующая функция, блокирует все, пока не придет входящее подключение.
1
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
19.12.2017, 09:50
Цитата Сообщение от Timas Посмотреть сообщение
Как решить проблему?
Можно крутиться в цикле и через любую из функций select/poll/epoll ожидать событие на сокете. И только если призошло событие (есть входные данные), тогда вызывать accept/read.

Либо можно настроить сокет как неблокирующий... в этом случае если нет данных, то все операции accept/read и т.п. будут возвращаться с ошибкой, а errno будет установлен в EAGAIN. Но этот вариант создаст большую нагрузку на процессор, т.к. программа будет непрерывно крутиться в цикле и обращаться к системным вызовам.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2017, 09:50
Помогаю со студенческими работами здесь

Ломается DoEvents - через 3-5 часов макрос не способен продолжать работу
Есть макрос, опрашивающий раз в минуту сайт. Все прочее время на статусбар вперемешку с DoEvents выводится оставшееся время до новой...

Вывод данных один раз, если сработало условие; в противном случае - продолжать работу
Program Optima; Uses Crt; var P,A,B,C,K : Longint; Kk,Kp : Integer; Summa,SummaM : Longint; ...

Сервер не даёт загрузить файл
Сервер не даёт загрузить файл из браузера. Объём файла 18 МБайт. Файл грузится через форму на сайте. Однако php-скрипт даже не начинает...

Сервер 1С не дает к себе подключиться
Проблема в следующем: При подключении к серверу 1С выдается сообщение: &quot;server_addr=tcp://HP:1562 descr=Ошибка стевого доступа к...

иногда сервер дает не верный ответ
помогите исправить проблему например юзер есть в бд но иногда пишет что его нету &lt;?php define('ROOT' , $_SERVER); include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru