Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 22.11.2018
Сообщений: 3
1

Сервер "зависает"

22.11.2018, 18:57. Просмотров 1946. Ответов 10
Метки нет (Все метки)

Пытаюсь написать клиент-сервер в Kdevelop на линуксе.
Написал значит гору текста сразу, сервер компилится и запускается без ошибок, но окно консоли просто пустое. Начал разбиратся, поудалял вообще все, оставил только все действие на подключение клиента (создал сокет, забиндил, сделал слушающим, другой соккет ждет accept), с клиента отправляю текст, на сервере принимаю с помощью recv(). Понатыкал после каждого действия на сервере cout<<"шаг N выполнен". Так вот в итоге то же самое, просто пустая консоль при запуске сервера. Если после этого запустить клиент и отослать текст, то сервер выводит сразу все (и все эти cout, которые я понатыкал, и переданный текст). То есть сервер ничего не выводит, пока не будет завершена работа программы, а потом выводит все, неважно где это было, хоть в самом начале программы. А выводит он после того, как завершит свою работу клиент. В Visual'e такой проблемы нет, с kdevelop до сокетов тоже ни с какими проблемами не сталкивался, так в чем причина такого поведения и как это исправить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2018, 18:57
Ответы с готовыми решениями:

Сокеты: как узнать ip адрес, с которым "связался" сервер?
bind(mysocket,(sockaddr *) &amp;local_addr, sizeof(local_addr)); функция осуществляет связывание...

Перестает "работать" сервер при повторном подключении клиента
Здравствуйте! Я совершенно недавно начал изучение С++ по этому столкнулся с проблемой которую не...

программа "Сервер - клиент". В чем тут ошибка?
Хочу реализовать подключение клиента к серверу...когда клиента подключиться к серверу то сервер...

Клиент сервер Winsock + SDL. Форма клиента зависает
Проблема клиета: Форма SDL зацикливаеться циклом while и создается менюшка с кнопками и текстом тут...

10
Модератор
3319 / 2106 / 337
Регистрация: 13.01.2012
Сообщений: 8,179
23.11.2018, 08:12 2
lostystyg, без взгляда на ваш код - никак. Телепатирую что там блокирующий сокет пытается читать больше чем в него отправляют и чтение висит до разрыва связи при котором оно отвисает ибо таковы законы мануалов
1
0 / 0 / 0
Регистрация: 22.11.2018
Сообщений: 3
23.11.2018, 16:12  [ТС] 3
Я же описал, что код самый простейший.
Ну к примеру клиент:
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
#include <iostream>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
 
#include <unistd.h>
using namespace std;
 
 
 
 
int main() {
    cout<<"now";
    int s=socket(AF_INET,SOCK_STREAM,0);
    cout<<"now";
    sockaddr_in sin;
    int sinlen=sizeof(sin);
    sin.sin_family = AF_INET;
    sin.sin_port = htons(50202);
    sin.sin_addr.s_addr = INADDR_ANY;
    if(bind(s,(sockaddr*)&sin,(socklen_t)sinlen)==-1)cout<<"error bind";
    if (listen(s,SOMAXCONN)==-1)cout<<"error listen";
    cout<<"server started";
    sockaddr_in addr;
    int addr1=sizeof(addr);
    int s1;
    s1=accept(s,(sockaddr*)&addr,(socklen_t*)&addr1);
    char buff[100];
    recv(s1,buff,100,0);
    cout<<buff;
    
    
    return 0;
}
Клиент просто коннектится к серверу и отправляет одно сообщение. И пока он это сообщение не отправит, на сервере не выведется ни один cout

Добавлено через 49 минут
В предыдущем сообщении код сервера, опечатался
0
Модератор
3319 / 2106 / 337
Регистрация: 13.01.2012
Сообщений: 8,179
23.11.2018, 18:26 4
lostystyg, отправьте сообщение длиной более 100 байт и поглядите что получится
0
534 / 215 / 68
Регистрация: 01.03.2011
Сообщений: 587
24.11.2018, 12:54 5
Лучший ответ Сообщение было отмечено vxg как решение

Решение

Вангую, что надо добавить <<endl
2
Модератор
3319 / 2106 / 337
Регистрация: 13.01.2012
Сообщений: 8,179
24.11.2018, 15:29 6
prik, не угадал
0
534 / 215 / 68
Регистрация: 01.03.2011
Сообщений: 587
24.11.2018, 15:53 7
vxg, А чем, кроме буферизации stdout можно объяснить, что код не выводит "now", "server started" и тд???
1
Модератор
3319 / 2106 / 337
Регистрация: 13.01.2012
Сообщений: 8,179
24.11.2018, 16:51 8
prik, тем чего мы не видим и что ТС счёл несущественным
0
0 / 0 / 0
Регистрация: 22.11.2018
Сообщений: 3
24.11.2018, 17:18  [ТС] 9
Если отправлять больше 100 байт, то просто доходят только 100 и они же выводятся. А вот добавление endl кстати помогло, теперь все нормально работает, только вот почему? В Visual Studio все работало нормально и без endl. Объясните, пожалуйста, в чем причина. И все же, хоть это и не понадобилось, что я счел несущественным по мнению vxg? Тоже уверен лишним узнать не будет.
0
534 / 215 / 68
Регистрация: 01.03.2011
Сообщений: 587
24.11.2018, 17:29 10
Лучший ответ Сообщение было отмечено vxg как решение

Решение

Цитата Сообщение от lostystyg Посмотреть сообщение
Если отправлять больше 100 байт, то просто доходят только 100 и они же выводятся.
Я понимаю, что пример. но так делать нельзя. При печати/работе с buff исходите из того, что клиент может прислать любой мусор, а не Си-строку.
Цитата Сообщение от lostystyg Посмотреть сообщение
А вот добавление endl кстати помогло, теперь все нормально работает, только вот почему?
stdout по умолчанию имеет строчную буферизацию.
2
Модератор
3319 / 2106 / 337
Регистрация: 13.01.2012
Сообщений: 8,179
24.11.2018, 21:15 11
Цитата Сообщение от lostystyg Посмотреть сообщение
И все же, хоть это и не понадобилось, что я счел несущественным
все что угодно) хоть это и не понадобилось - у вас составное приложение, но дан код только сервера
Цитата Сообщение от prik Посмотреть сообщение
stdout по умолчанию имеет строчную буферизацию
In many implementations, standard output is line-buffered
хотя в этом случае судя по всему ТС на это и наехал колесом
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2018, 21:15

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

IRC бот, ответ сервера: "Couldn't resolve your hostname"
Создаю socket конекчусь все нормально отправляю &quot;NICK JohnConnor&quot; &quot;USER Eboj localhost * :Eboj&quot;...

Нужна литература на тему "Разработка параллельного сервера на линукс"?
Вообщем, если кто обладает инфой(статьи,ссылки или название книжек, прошу поделится). В основном...

Что такое "unresolved external symbol _WSACleanup@0"?
Здравствуйте, есть проект на VC6, использующий Winsock с таким кодом: #include 'winsock.h' ...

ERROR PIN.CPP: Unable to open include file "winsock.h"
привет вссем! я не профи в программировании, но имею базу. мне необходимо создать прогу, которая...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.