Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/35: Рейтинг темы: голосов - 35, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 06.03.2012
Сообщений: 9

Консольный чат - нужен пример

08.03.2012, 21:16. Показов 7308. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, пишу консольный чат на си, у программы клиента 2 процесса один отвечает за получение сообщений, другой ждет ввод с экрана, чтобы отправить сообщение.
допустим я пишу сообщение и в это время мне приходит сообщение. как сделать чтобы оно выводилась отдельной строкой, а я свое продолжил писать в том же месте.
то есть например такая фигня происходит:
приfiller: здарова)
_
а надо сделать так:
filler: здарова)
при_

_ это курсор
заранее спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.03.2012, 21:16
Ответы с готовыми решениями:

Консольный чат
Надо консольную приложуху написать, суть в том, что когда что то вводишь, то всё сдвигается вверх, а надо чтобы было как-бы две...

Консольный чат на WinSock
Доброго времени суток. В общем есть консольный чат на WinSock, но проблема такая:обмениваться сообщениями сервер может только с одним...

Консольный ТСР-чат
Всем доброго утра! Есть такой чат: namespace ChatServer { class Program { static ServerObject server; //...

9
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.03.2012, 09:51
А почему бы не сделать отдельное поле для ввода сообщения, и отдельное для всех сообщений, которые уже пришли в чат, как сделано во всех чатах?
0
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
09.03.2012, 10:10
Чат нуждается в доработке, притом серьезной.
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <winsock2.h>
#define PORT 666   //Будем использовать порт 666
using namespace std;
struct UserOnline{
int UserID;
SOCKET UserSock;
int SendHim(char buff[4096]);
}
 
class ServerSocket{
public:
static UserOnline *Userr;
int StartServer();
int StopServer();
static DWORD WINAPI Accept(LPVOID Nothing);
static DWORD WINAPI ClientRead(LPVOID usermem);
static SOCKET ServerSock;
static SOCKET TempSock;
};
class ClientSocket{
public:
int ConnectServer(char IP[17]);
int DisconnectFromServer();
static SOCKET ClientSockett;
static DWORD WINAPI ClientRecv(LPVOID Nothing);
};
int ServerSocket::StartServer()
{
WSAData wsadata;
if(WSAStartup(0x202,&wsadata)){cout <<"Wsastartup fail"<<endl; return -1;}
ServerSock=socket(AF_INET,SOCK_STREAM,0);
if(ServerSock==INVALID_SOCKET){cout<<"Invalid Socket"<<endl; return -2;}
sockaddr_in ServerAddr;
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_port=htons(PORT);
ServerAddr.sin_addr.s_addr=0;
if(bind(ServerSock,(sockaddr *)&ServerAddr,sizeof(ServerAddr))!=0){cout<<"Bind fail"<<endl; return -3;}
if(listen(ServerSock,0x100)){cout<<"Listen fail"<<endl; return -4;}
CreateThread(0,0,&Accept,0,0,0);
return 1;
}
DWORD WINAPI ServerSocket::Accept(LPVOID Nothing)
{
    sockaddr ClientAddr;
    int ClientAddrSize=sizeof(ClientAddr);
    int Id;
    while((TempSock=accept(ServerSock,&ClientAddr,&ClientAddrSize)))
    {
        Userr=new UserOnline;
        HOSTENT *hst;
                hst=gethostbyname((char*)&ClientAddr);
 
        for(Id=0;Id<sizeof(Userr);Id++)
        {
            if(Userr[Id].UserSock=0)
            {
                Userr[Id].UserSock=TempSock;
                break;
            }
        }
    CreateThread(0,0,&ClientRead,&Userr[Id],0,0);
    }
}
DWORD WINAPI ServerSocket::ClientRead(LPVOID usermem)
{
char buff[4096];
UserOnline *Userr;
Userr=(UserOnline*) usermem;
int Size;
while(Size=recv(Userr->UserSock,buff,4096,0)&&Size==INVALID_SOCKET)
{
cout <<buff<<endl;
for(int i;i<sizeof(Userr);i++){Userr[i].SendHim(buff);}
}
 
}
int UserOnline::SendHim(char buff[4096]){int i=send(UserSock,buff,sizeof(buff),0); return i;}
//------------------------------CLIENT---------------------------------------
int ClientSocket::ConnectServer(char IP[17])
{
WSADATA wsadata;
if(WSAStartup(0x202,&wsadata)){cout <<"WSAStartup Error: "<<WSAGetLastError()<<endl;return -1;}
ClientSockett=socket(AF_INET,SOCK_STREAM,0);
if(ClientSockett==INVALID_SOCKET){cout <<"INVALID Socket"<<endl; return -2;}
 
sockaddr_in ClientAddr;
    ClientAddr.sin_family=AF_INET;
    ClientAddr.sin_port=htons(PORT);
    HOSTENT *hst;
    if (inet_addr(IP)!=INADDR_NONE){
      ClientAddr.sin_addr.s_addr=inet_addr(IP);}
    else
    {
      // попытка получить IP адрес по доменному
      // имени сервера
      if (hst=gethostbyname(IP))
      {
      ((unsigned long *)&ClientAddr.sin_addr)[0]=
        ((unsigned long **)hst->h_addr_list)[0][0];
        }
      else 
      {
        cout <<"Invalid IP Address"<<IP<<endl;
        closesocket(ClientSockett);
        WSACleanup();
        return -3;
      }
      }
if (connect(ClientSockett,(sockaddr *)&ClientAddr,
                sizeof(ClientAddr)))
{cout <<"Connect error"<<WSAGetLastError()<<endl;
closesocket(ClientSockett);
WSACleanup();
return -4;
}
CreateThread(0,0,&ClientRecv,0,0,0);
return 0;
}
DWORD WINAPI ClientSocket::ClientRecv(LPVOID Nothing)
{
  int nsize;
  char buff[4096];
    while((nsize=recv(ClientSockett,&buff[0],
                      sizeof(buff)-1,0))
                  !=SOCKET_ERROR)
{cout<<buff<<endl;}
closesocket(ClientSockett);
WSACleanup();
}
int main()
{
system("color a");
system("title Чат");
cout <<"Chat"<<endl;
ServerSocket *SS;
ClientSocket *CS;
int ChatType;
char passbuff[4096];
cout <<"Choose chat type:"<<endl
     <<"1: Chat (Server)"<<endl
       <<"2: Chat (Client)"<<endl;
cin>>ChatType;
switch(ChatType)
{
case 1:
SS->StartServer();
while(true){cin>>passbuff; for(int i;i<sizeof(SS->Userr);i++){SS->Userr[i].SendHim(passbuff);}}
case 2:
cout<<"Enter Server IP:";
cin>>passbuff;
CS->ConnectServer(passbuff);
while(true){cin >>passbuff; send(CS->ClientSockett,passbuff,sizeof(passbuff),0);}
default:
cout <<"Error choose server type quit"<<endl;
}
return 0;
}
0
0 / 0 / 0
Регистрация: 06.03.2012
Сообщений: 9
09.03.2012, 10:59  [ТС]
silent_1991, что значит отдельное окно? отдельный терминал? это как то странно в 2 терминала чат
а если в одном терминале на 2 окошка разделить, то как это сделать?
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.03.2012, 11:07
отдельное поле, а не окно, это значит в одном месте окна ты пишешь, в другом тебе приходят сообщения! вы чат ни разу не видели?О_о
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.03.2012, 11:09
fi11er, зачем отдельный, в одном терминале просто будут две области. Когда в чат приходит сообщение, программа запоминает положение курсора и содержимое поля ввода сообщения, переводит курсор в позицию, в которой надо выводить пришедшее сообщение, выводит его и переводит курсор обратно в поле ввода текста в запомненные ранее позиции. Как-то так.
0
0 / 0 / 0
Регистрация: 06.03.2012
Сообщений: 9
09.03.2012, 11:12  [ТС]
ой спросоня прочитал окно. спасибо, впринципе я и думал что это как-то так реализуется а как сделать перевод курсора? (консоль линукс)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.03.2012, 11:13
fi11er, через эскейп-последовательности.
1
0 / 0 / 0
Регистрация: 06.03.2012
Сообщений: 9
09.03.2012, 11:16  [ТС]
спасибо
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.03.2012, 11:48
А чем возврат каретки плох?
Вроде такого.
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
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
#include <unistd.h> //or windows.h for sleep
 
int main()
{
    setlocale(LC_CTYPE, "");
    
    wchar_t str[] = L"при";
    wchar_t message[] = L"filler: здарова)";
    
    wprintf(L"%S", str);
    fflush(stdout);
    
    sleep(3);
        
    putwchar(L'\r');
        
    fflush(stdout);
        
    wprintf(L"%S\n%S", message, str);
    
    fflush(stdout);
    
    sleep(3);
 
        return 0;
}
Только надо еще учесть, что message может быть короче, чем str, тогда от str лишние символы останутся, и их нужно будет добить пробелами.

P.S. у меня под линухом работает, на винде не уверен, что будет работать.

Добавлено через 21 минуту
Под MinGW тоже работает, только пришлось исходник немного подредактировать, ибо проблемы с кодировками и sleep были.
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
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
#include <windows.h> 
 
int main()
{
        setlocale(LC_ALL, "");
 
        wchar_t str[20] = L"при";
        wchar_t message[20] = L"filler: здорова)";
 
        wprintf(str);
        fflush(stdout);
 
        Sleep(3000);
 
        putwchar(L'\r');
 
        fflush(stdout);
 
        wprintf(message);
        putwchar('\n');
        wprintf(str);
 
        fflush(stdout);
 
        Sleep(3000);
 
        return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2012, 11:48
Помогаю со студенческими работами здесь

консольный чат с использованием socket
Есть сервер и пару клиентов как можно организовать чат? если использовать стандартные функции типа send and recv возникают проблемы, так...

Консольный чат в консольном приложении
Есть ли варианты как создать чат в консоли? Консоль сама по себе штука маленькая, весит мало, а как сделать может кто подсказать или...

консольный чат на протоколе ТСР
как с нуля выглядит код который описывается в этой ссылке. Заранее спасибо!

Консольный чат - проблемы с подключением
Что почитать, куда нюхать , куда смотреть , чтоб создать чат в консольном ? я знаю вот эти библиотеки ( пространство имен, точно...

Консольный чат Клиенты-Сервер на сокетах
При отправки сообщения клиентом, оно приходит только серверу, а как сделать, чтобы оно приходило еще всем клиентам? Сервер: ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru