Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/65: Рейтинг темы: голосов - 65, средняя оценка - 4.82
2 / 2 / 0
Регистрация: 07.05.2015
Сообщений: 79

Чат на сокетах

26.07.2015, 20:31. Показов 12893. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я создаю чат на С ++, только такой в котором 1 сервер который как и клиент также может отправлять и принимать сообщения и 1 клиент.И я не как не могу сделать так, чтобы клиент в любое время мог принимать сообщения от сервера даже когда клиент набирает сообщение серверу. Как сделать так чтобы одновременно можно было получать, даже когда пишешь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2015, 20:31
Ответы с готовыми решениями:

Чат на сокетах
Есть сервер и клиент когда отправляешь сообщение с первого клиента втором то сообщения не появляется у второго клиента а появляется после...

Простой чат на сокетах
Доброго времени суток. Имеется VDS сервер с установленной на нём ОС Linux, на моём пк установлен Windows. Нашёл на просторах сети...

О сокетах
Здравствуйте, возникло пару вопросов о сокетах. 1)Создаю я сервер и жду конекта, accept принимаю подключение. В этой функции 3 параметра,...

17
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
26.07.2015, 20:38
Цитата Сообщение от Restomix Посмотреть сообщение
Как сделать
взять и сделать. где именно проблема? для примера: вы не можете так сделать потому что...
1 у вас консоль
2 вы не проверяете есть ли входящие данные до тех пор пока пользователь не пошлет сообщение
3 что-то свое
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
26.07.2015, 21:28
http://www.boost.org/doc/libs/... mples.html
1
2 / 2 / 0
Регистрация: 07.05.2015
Сообщений: 79
28.07.2015, 17:32  [ТС]
vxg, первое и второе.Как мне в одно же время слушать посылать ?
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
28.07.2015, 17:53
А код какой-то уже создан? Или пока создаются только планы по созданию?

Добавлено через 50 секунд
Цитата Сообщение от Restomix Посмотреть сообщение
одно же время слушать посылать ?
в двух потоках, либо nonblocking socket
1
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
29.07.2015, 23:22
Цитата Сообщение от Restomix Посмотреть сообщение
vxg, первое и второе
не долго думая суем прием и передачу в разные консоли... Прием пакетов по UDP
1
2 / 2 / 0
Регистрация: 07.05.2015
Сообщений: 79
30.07.2015, 15:00  [ТС]
#server-client
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
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <string>
using namespace std;
 
int main()
{   
    WSADATA WsaData;
    int error=WSAStartup(0x0202,&WsaData);
    
    if(error==SOCKET_ERROR)
    {
        cout<<"WsaData_ERROR";
        return 0;
    }
    
    SOCKET mysocket;
    mysocket=socket(AF_INET,SOCK_STREAM,0);
    
    if(mysocket==-1)
    {
        cout<<"SocketError";
    }
    
    sockaddr_in my_addr;
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(7710);
    my_addr.sin_addr.s_addr=0;
    
    error=bind(mysocket,(sockaddr*) &my_addr, sizeof(my_addr));
    
    if(error == -1)
    {
        cout<<"bind_ERROR";
    }
    
    listen(mysocket,0x2);
    SOCKET client_socket;
    
    client_socket=socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in addr_klient;
    int number_k=0;
    int size_k=sizeof(addr_klient);
    
    cout<<"listening...";
    
    client_socket=accept(mysocket,(sockaddr*)&addr_klient,&size_k);
    
    if(client_socket<0)
    {
        cout<<"accept_EROR";
    }
    
    //отправка и прием 
    char buffer[1024];
    cout<<"Your name: ";
    gets(buffer);
    buffer[strlen(buffer)]=':';
    while(1)
    {   
        int longg=strlen(buffer);
        gets(buffer+longg);
        send(client_socket,&buffer[0],strlen(buffer),0);
        for(int i=0;buffer[longg+i]!='\0';i++)
        {
            buffer[longg+i]=NULL;
        }
    }
    return 0;
    }
#client
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
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <string>
using namespace std;
int main()
{
    WSADATA WsaData;
    int error=WSAStartup(0x0202,&WsaData);
    
    if(error==SOCKET_ERROR)
    {
        cout<<"WsaData_ERROR";
        return 0;
    }
    
    SOCKET mysocket;
    mysocket=socket(AF_INET,SOCK_STREAM,0);
    
    if(mysocket==-1)
    {
        cout<<"SocketError";
    }
    
    sockaddr_in my_addr;
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(7710);
    my_addr.sin_addr.S_un.S_addr = inet_addr("130.185.59.101");
    
    cout<<"Connecting...";
    
    if(error=connect(mysocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))==0)
    {
        cout<<"Bind with server true";
    }
 
    //прием и отправка
    char buffer[1024];
    while(1)
    {
        recv(mysocket,&buffer[0],sizeof(buffer),0);
        cout<<buffer<<"\n";
        for(int i=0;buffer[i]!='\0';i++)
        {
            buffer[i]=NULL;
        }
    }
    
    return 0;
}
Добавлено через 4 минуты
Как это в двух потоках, то есть DWORD WINAPI?Дай какой-то пример пожалуйста.
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
30.07.2015, 16:53
А у тебя что, сервер только посылает, а клиент только слушает?
1
2 / 2 / 0
Регистрация: 07.05.2015
Сообщений: 79
30.07.2015, 17:39  [ТС]
я могу дописать в сервер recv а в клиент send.Но смысл не в том, как мне в одно же время слушать и посылать ?
0
 Аватар для Bend3r
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
30.07.2015, 21:45
Цитата Сообщение от Restomix Посмотреть сообщение
я могу дописать в сервер recv а в клиент send.Но смысл не в том, как мне в одно же время слушать и посылать ?
Один сокет в потоке слушает, второй принимает в главном треде. Прежде чем сесть за задачу разбейте ее на части и решайте ее частями. Вам советую сначала прочитать литературу про TCP/IP, Thread и т.п. вещи.
1
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
31.07.2015, 03:30
Меня больше затрудняет одновременный ввод с клавиатуры в одном потоке и вывод на экран в другом
1
2 / 2 / 0
Регистрация: 07.05.2015
Сообщений: 79
31.07.2015, 10:23  [ТС]
это наверно на c ++ не реально сделать.Сколько перечитал подобных примеров не видел
1
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
31.07.2015, 13:03
Сервер:
Кликните здесь для просмотра всего текста

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
 
DWORD WINAPI recvthread(LPVOID param)
{
 char inbuf[1024];
 SOCKET sock = *(SOCKET*)param;
 while(1)
 {
  int recvres = recv(sock, inbuf, 1023, 0);
  if(recvres == SOCKET_ERROR)break; //что-то пошло не по плану
  inbuf[recvres] = 0;
  //////////////////////////////////////////
  printf("%s", inbuf);//нужна альтернатива//
  //////////////////////////////////////////
 
 };
 return(-1);
};
 
int main()
{   
    WSADATA WsaData;
    int error=WSAStartup(0x0202,&WsaData);
    
    if(error==SOCKET_ERROR)
    {
        cout<<"WsaData_ERROR";
        WSACleanup();
        return 0;
    }
    
    SOCKET mysocket;
    mysocket=socket(AF_INET,SOCK_STREAM,0);
    
    if(mysocket==-1)
    {
        cout<<"SocketError";
        WSACleanup();
        return 0;
    }
    
    sockaddr_in my_addr;
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(7710);
    my_addr.sin_addr.s_addr=0;
    
    error=bind(mysocket,(sockaddr*) &my_addr, sizeof(my_addr));
    
    if(error == -1)
    {
        cout<<"bind_ERROR";
        WSACleanup();
        return 0;
    }
    
    listen(mysocket,0x2);
    SOCKET client_socket;
    
    //client_socket=socket(AF_INET,SOCK_STREAM,0); - эта строка НЕ НУЖНА, тебе accept и так сокет создаст и вернет
    sockaddr_in addr_klient;
    int number_k=0;
    int size_k=sizeof(addr_klient);
    
    cout<<"listening...";
    
    client_socket=accept(mysocket,(sockaddr*)&addr_klient,&size_k);
    closesocket(mysocket);
    if(client_socket<0)
    {
        cout<<"accept_EROR";
        WSACleanup();
        return 0;
    }
    
    //отправка и прием 
    char buffer[1024];
    cout<<"Your name: ";
    gets(buffer);//странный выбор, cin мож тогда уже?
    int longg=strlen(buffer);
    buffer[longg++]=':';
 
    CreateThread(0, 0, recvthread, (LPVOID)&client_socket, 0, 0);//создаем собственно поток кторый слушает чо прийдет
    
    
    while(1)//а этот цикл в основном потоке отправляет в сеть то что мы напичатали
    {   
        /////////////////////////////////////////
        gets(buffer+longg);//нужна альтернатива//да и за границы массива можно выйти
        /////////////////////////////////////////
        strcat(buffer, "\n");
 
 
        if(SOCKET_ERROR == send(client_socket, buffer, strlen(buffer) + 1/*null-terminated string посылаем же*/, 0))
          break;
    }
 
    WSACleanup();//второй поток закрывать не нужно, так как после WSACleanup recv вернет SOCKET_ERROR и поток автоматом закроется
    return -1;
}

клиент:
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
 
DWORD WINAPI recvthread(LPVOID param)
{
 char inbuf[1024];
 SOCKET sock = *(SOCKET*)param;
 while(1)
 {
  int recvres = recv(sock, inbuf, 1024, 0);
  if(recvres == SOCKET_ERROR)break; //что-то пошло не по плану
 
  //////////////////////////////////////////
  printf("%s", inbuf);//нужна альтернатива//
  //////////////////////////////////////////
 
 };
 return(-1);
};
 
int main()
{   
    WSADATA WsaData;
    int error=WSAStartup(0x0202,&WsaData);
    
    if(error==SOCKET_ERROR)
    {
        cout<<"WsaData_ERROR";
        return 0;
    }
    
    SOCKET mysocket;
    mysocket=socket(AF_INET,SOCK_STREAM,0);
    
    if(mysocket==-1)
    {
        cout<<"SocketError";
    }
    
    sockaddr_in my_addr;
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(7710);
    my_addr.sin_addr.s_addr=inet_addr("127.0.0.1");  
    
    if(SOCKET_ERROR == connect(mysocket, (SOCKADDR*)&my_addr, sizeof(my_addr)))
    {
      cout << "connect error";
      WSACleanup();
      return 0;
    };
 
    
    //отправка и прием 
    char buffer[1024];
    cout<<"Your name: ";
    gets(buffer);
    int longg=strlen(buffer);
    buffer[longg++]=':';
 
    CreateThread (0, 0, recvthread, (LPVOID)&mysocket, 0, 0);
 
    while(1)
    {   
        gets(buffer+longg);
        strcat(buffer, "\n");
 
        if(SOCKET_ERROR == send(mysocket, buffer, strlen(buffer) + 1, 0))
          break;
        buffer[longg]=0;
    }
    WSACleanup();
    return -1;
}
2
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
31.07.2015, 13:08
скрин =)
Миниатюры
Чат на сокетах  
1
2 / 2 / 0
Регистрация: 07.05.2015
Сообщений: 79
31.07.2015, 15:07  [ТС]
Спасибо большое, очень помог.
C++
1
2
if(SOCKET_ERROR == send(client_socket, buffer, strlen(buffer) + 1/*null-terminated string посылаем же*/, 0))
          break;
То есть если мы ничего не пишем цикл перерываем.
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
31.07.2015, 15:31
если send возвращает SOCKET_ERROR - значит дисконнект, либо еще какая-нибудь оказия. Да, просто прерываем цикл и прога закрывается

Добавлено через 10 минут
если тебе что-то присылают, когда ты начал печатать, будет глюк.
1
2 / 2 / 0
Регистрация: 07.05.2015
Сообщений: 79
31.07.2015, 18:10  [ТС]
если мне что-то присылают, и я тогда начал печатать я уже не смогу редактировать то что написал оно летит в буфер и следущий gets его дополняет.То есть я смогу буфер обнулить или же не как не смогу редактировать правильно другого выхода нету для консоли?
0
23 / 23 / 8
Регистрация: 03.12.2013
Сообщений: 202
17.07.2019, 15:02
Спасибо за работающий пример в 13 сообщении. Через несколько минут (10 - 20) происходит разрыв соединения (на отдельном ПК, со статическим IP). Как устранить самопроизвольный disconnect ? Заранее спасибо за ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2019, 15:02
Помогаю со студенческими работами здесь

SDP на TCP сокетах
Всем привет. Написал приложение использующее TCP сокеты, теперь нужно чтобы по протоколу SDP оно отправлялj информацию о том, что будет...

Алгоритм сервера на сокетах
Помогите пожалуйста, только начал копаться в socket`aх. Уже создал простой &quot;эхо&quot; сервер и клиент к нему. А хотелось бы сделать что-то на...

Многопоочност в сокетах VCL
Пишу приложене типа клиент-сервер, пр этом универсальное, то есть каждый хост в сети является одновременно сервером. Но связь с другими...

Клиент и сервера на сокетах
Пытаюсь изучить Winsock, вот написал клиент и сервер. Сервер не дожидаясь запроса на подключение закрывается, и клиент тоже закрывается и...

Нужна литература о сокетах
Доброго времени суток! Можете посоветовать какую-нибудь литературу по поводу сокетов в СИ++. В Интернете все обыскал, не то... Вообще...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru