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

Программа чат: не работает на разных компьютерах

07.06.2014, 12:52. Показов 1385. Ответов 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
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
#include "StdAfx.h"
#include "Server.h"
char buff[1024];
 
long string_to_net_adress(String^ stroka)
{
    long rezult=0;
    List<String^> el = stroka->Split('.');
    for (int i=0;i<el.Count;i++)
    {
        rezult+=Convert::ToInt32(el[i])*Convert::ToInt32(Math::Pow(256,i));
    }
    return rezult;
}
Server::Server(RichTextBox^ _rich, String^ _name, String^ _ip, int _port)
{
    port = _port;
    ip = _ip;
    name = _name;
    rich = _rich;
    WSADATA data;
    if(WSAStartup(0x0202,(WSADATA *) &data))
        return;
    if((soc = socket(AF_INET,SOCK_STREAM,0))<0);
    {
        WSACleanup();
        return;
    }
}
 
void Server::start_server()
{
    sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port);
    serv_addr.sin_addr.s_addr = string_to_net_adress(ip);
 
    if(bind(soc,(sockaddr *) &serv_addr, sizeof(serv_addr)))
    {   
        closesocket(soc);  
        WSACleanup();
        return;
    }
    if(listen(soc, 0x100))
    {
        closesocket(soc);
        WSACleanup();
        return;
    }
    sockaddr_in client_addr;
    int client_addr_size = sizeof(client_addr);
    
    while((client_soc=accept(soc, (sockaddr *) &client_addr, &client_addr_size)))
    {
        if(!clients.Contains(client_soc))
            clients.Add(client_soc);
        th = gcnew Thread(gcnew ThreadStart(this, &Server::service_client));
        th->IsBackground = true;
        th->Start();
    }
    closesocket(soc);
    WSACleanup();
    return ;
}
 
void Server::service_client()
{
    int bytes_recv;
    SOCKET my_sock = client_soc;
    while((bytes_recv=recv(my_sock,&buff[0],sizeof(buff)-1,0))!=SOCKET_ERROR)
    {
        int count = sizeof(buff);
        Server::stroka = gcnew String(buff);
        rich->Invoke(gcnew Action(this, &Server::SetTextToMemo));
        for (int i=0;i<clients.Count;i++)
        {
            send(clients[i],buff,stroka->Length,0);
        }
        for(int i=0;i<bytes_recv;i++)
            buff[i]=0;
    }
    closesocket(soc);
    WSACleanup();
    return ;
}
 
void Server::SetTextToMemo()
{
    String^ nick_n = stroka->Substring(stroka->IndexOf("~")+1);
    String^ mes = stroka->Substring(0, stroka->IndexOf("~"));
    Server::rich->AppendText(nick_n+"            "+Convert::ToString(System::DateTime::Now)+Environment::NewLine);
    rich->SelectedText = rich->Lines[rich->Lines->Length-1];
    rich->SelectionFont = gcnew System::Drawing::Font("Times New Roman",20);
    Server::rich->AppendText(mes+Environment::NewLine);
}
 
void Server::send_message(String^ mess)
{
    int i;
    String^ sep = "~";
    for(i=0;i<mess->Length;i++)
        buff[i] = mess[i];
    buff[mess->Length] = sep[0];
    i++;
    for(int j=0;j<name->Length;j++,i++)
        buff[i] = name[j];
    for (int i=0;i<clients.Count;i++)
        send(clients[i],&buff[0],mess->Length+name->Length+1,0);
    rich->AppendText(name+"            "+Convert::ToString(System::DateTime::Now)+Environment::NewLine);
    rich->AppendText(mess+Environment::NewLine);
}
 
Server::~Server()
{
    if (th!=nullptr)
    {
        th->Abort();
    }
}
Клиент:
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
#include "StdAfx.h"
#include "Client.h"
char buffer[1024];
 
long str_to_net_adress(String^ stroka)
{
    long rezult=0;
    List<String^> el = stroka->Split('.');
    for (int i=0;i<el.Count;i++)
    {
        rezult+=Convert::ToInt32(el[i])*Convert::ToInt32(Math::Pow(256,i));
    }
    return rezult;
}
 
Client::Client(RichTextBox^ _rich, String^ _name, String^ _ip, int _port)
{
    port = _port;
    ip = _ip;
    name = _name;
    rich = _rich;
    WSADATA data;
    WSAStartup(0x0202,(WSADATA *) &data);
    soc = socket(AF_INET,SOCK_STREAM,0);
}
 
void Client::Start_Client()
{
    sockaddr_in dest_addr;
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(port);
    // преобразование IP адреса из символьного в сетевой формат
    if (str_to_net_adress(ip)!=INADDR_NONE)
        dest_addr.sin_addr.s_addr=str_to_net_adress(ip);
    else
    {
        closesocket(soc);
        WSACleanup();
        return ;
    }
    // адрес сервера получен – пытаемся установить соединение 
    if (connect(soc,(sockaddr *)&dest_addr,sizeof(dest_addr)))
    {
        closesocket(soc);
        WSACleanup();
        return;
    }
    Thread ^th = gcnew Thread(gcnew ThreadStart(this, &Client::get_data_from_srver));
    th->Start();
}
 
void Client::send_message(String^ mess)
{
    int i;
    String^ sep = "~";
    for(i=0; i<mess->Length; i++)
        buffer[i] = mess[i];
    buffer[mess->Length] = sep[0];
    i++;
    for(int j=0;j<name->Length;j++,i++)
        buffer[i] = name[j];
    send(soc,&buffer[0],mess->Length+name->Length+1,0);
}
 
void Client::SetTextToTextBox()
{
    String^ nick_n = stroka->Substring(stroka->IndexOf("~")+1);
    String^ mes = stroka->Substring(0, stroka->IndexOf("~"));
    Client::rich->AppendText(nick_n+"            "+Convert::ToString(System::DateTime::Now)+Environment::NewLine);
    rich->SelectedText = rich->Lines[rich->Lines->Length-1];
    rich->SelectionFont = gcnew System::Drawing::Font("Times New Roman",20);
    Client::rich->AppendText(mes+Environment::NewLine);
}
 
void Client::get_data_from_srver()
{
    int nsize;
    while((nsize=recv(soc,&buffer[0],sizeof(buffer)-1,0))!=SOCKET_ERROR)
    {
        Client::stroka = gcnew String(buffer);
        for(int i=0;i<nsize;i++)
        buffer[i] = 0;
        rich->Invoke(gcnew Action(this, &Client::SetTextToTextBox));
    }
    closesocket(soc);
    WSACleanup();
    return;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.06.2014, 12:52
Ответы с готовыми решениями:

Как запускать чат на разных компьютерах
Сделал чат по уроку с ServerSocket и ClientSocket, работает на одном компьютере, если адрес 127.0.0.1, но какой адрес должен быть при...

QTcpServer не работает на разных компьютерах
Доброго времени суток. Сейчас пытаюсь вникнуть в сетевое программирование на Qt. Для тренировки взял исходник Fortune клиента и сервера (из...

Сервис не работает на разных компьютерах
есть дуплексный клиент-сервер. типа чатик. проблема в том, что на localhost всё прекрасно работает, как только я заменяю localhost на...

3
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.06.2014, 13:02
Цитата Сообщение от Karfa Посмотреть сообщение
Программа "Чат" работает, если запускать клиент и сервер на одном компьютере. Как только пробуешь запустить на нескольких компьютерах сообщения не отправляются.
Дык что угодно может быть - NAT, фаервол, "серый" IP...

Цитата Сообщение от Karfa Посмотреть сообщение
Чат на С++
C++/CLI - это не C++, это .NET-язык с C++-подобным синтаксисом.
0
0 / 0 / 0
Регистрация: 09.09.2013
Сообщений: 27
07.06.2014, 14:12  [ТС]
А в коде с точки зрения "правильности" всё правильно реализовано? Должно ведь работать?
0
0 / 0 / 0
Регистрация: 09.09.2013
Сообщений: 27
09.06.2014, 10:53  [ТС]
АП!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.06.2014, 10:53
Помогаю со студенческими работами здесь

Консольный чат работает на одном компьютере, на разных - не работает. WinSock
Доброго времени суток. Собственно вот как дело обстоит: Если запустить на одном компьютере клиент и сервер и подключаться соответственно к...

Не работает программа на других компьютерах
Здравствуйте. Скопипастил написал программу на сокетах (пример взят с учебника), запустил. Всё работает нормально, ошибок и вылетов нет....

Программа не работает на некоторых компьютерах.
Может кто то встречался с подобными ошибками,а то я уже голову ломаю вторую неделю и ничего не выходит. У меня есть прога на VB ,я делаю...

Программа работает не на всех компьютерах
Всем привет. Есть такая проблема- написал программу. Суть программы- ждет подключение флешки и далее получает ее с\н.. Все работает, но...

Программа не работает на других компьютерах
Вообщем для друга писал на ноуте программу.Много времени потратил.Марался с интерфейсом.Но почему то только на моем ноуте эта прога...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru