Форум программистов, компьютерный форум CyberForum.ru

Клиент-серверный чат на C++ с использованием WinSock - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Насколько плохо написан код? http://www.cyberforum.ru/cpp-beginners/thread1817826.html
написал программу с горем да пополам, но появился вопрос о ее качестве. насколько плохо она написана? стояла такая задача: программа содержит массив строк, каждый из которых представляет собой запись про учетную запись пользователя, а каждое поле отделяется от другого двоеточием. известно, что первое поле сохраняет логин, пятое - имя и фамилию через запятую, а шестое - пароль запросить логин...
C++ Реализовать класс "Очередь" Помогите разобраться при создании очереди чисел все просто и понятно, к примеру есть поле value туда я помещаю числа и оттуда могу их их взять: head = new element ; tail = head; head->value = x; head->adr=0; size = 1; http://www.cyberforum.ru/cpp-beginners/thread1817825.html
C++ Реализовать поиск слова в текстовом файле
Необходимо создать консольное приложение, которое по заданному пользователем слову будет обращаться в файл txt с текстом и искать заданное слово, при нахождении такого слова вывести об этом сообщение, если нет то нет, слово должно искаться с учетом регистров, даже если оно в файле будет забориком написано, как можно проще, я даун в программировании,пока что, помогите плиз
В считывание с файла возникает ошибка C++
Так случилось, что я сменил версию visual studio и работающая программа перестала нормально работать (возникает точка остановки). #include "stdafx.h" #include <iostream> #include <conio.h> #include <time.h> #include <cmath> #include <fstream> #include <algorithm> using namespace std;
C++ Вывод пирамиды чисел в консоли http://www.cyberforum.ru/cpp-beginners/thread1817797.html
Подскажите как реализовать вывод вот такой пирамиды чисел: ___1___ __121__ _12321_ 1234321 ....
C++ Выбрать вариант не имеющий ошибки и к каждому написать почему этот вариант правильный/неправильный Прошу помогите, я плохо понимаю c++, да и простите если не в той теме, в общем, дали задание: Выбрать вариант не имеющий ошибки и к каждому написать почему этот вариант правильный/неправильный. (а) if (num == 10) else num = 0; (c) подробнее

Показать сообщение отдельно
unlimeted
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 26
02.10.2016, 18:46     Клиент-серверный чат на C++ с использованием WinSock
Привет всем, прошу помощи в реализации Клиент-серверного чата 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
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
// Server
 
#include <iostream>
#include <windows.h>
#include <winsock.h>
#pragma comment (lib, "ws2_32.lib")
 
void getWord(char *mas);
void SendMessageToClient(int ID);
int ClientCount = 0;
SOCKET *Connections;
using namespace std;
 
int main()
{
    system("chcp < nul 1251");
 
    cout << "Server: " << endl;
 
    char message[MAX_PATH];
    char *m_connect = "Сообщение от сервера : Вы подключились к серверуe.";
 
    WSAData wsa;
    WORD Version = MAKEWORD(2, 1);
    WSAStartup(Version, &wsa);
    Connections = (SOCKET*)calloc(64, sizeof(SOCKET));
 
    if (WSAStartup(Version, &wsa) != 0)
    {
 
        cout << "WSA library startup error." << endl;
 
    }
    else
    {
 
        cout << "WSA library startup complite." << endl;
 
    }
 
    SOCKET Listen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    SOCKET Connect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if (Listen == SOCKET_ERROR || Connect == SOCKET_ERROR)
    {
 
        cout << "Ошибка создания сокета" << endl;
 
    }
    else
    {
        cout << "Сокет создан" << endl;
 
    }
 
    SOCKADDR_IN Server;
 
    Server.sin_family = AF_INET;
    Server.sin_port = htons(1337);
    Server.sin_addr.s_addr = INADDR_ANY; 
 
    
    if (bind(Listen, (SOCKADDR*)&Server, sizeof(Server)) == SOCKET_ERROR)
    {
 
        cout << "Ошибка соединение" << endl;
 
    }
    else
    {
 
        cout << "Сервер активен" << endl;
 
    }
 
    listen(Listen, SOMAXCONN);
 
    while (true)
 
    {
 
        if (Connect = accept(Listen, NULL, NULL))
        {
 
            cout << "Подключен клиент" << endl;
            
            Connections[ClientCount] = Connect;
            send(Connections[ClientCount], m_connect, strlen(m_connect), NULL);
 
            recv(Connect, message, sizeof(message), 0);
            ClientCount++;
        
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)SendMessageToClient, (LPVOID)(ClientCount-1), NULL, NULL);
 
 
 
        }
 
 
 
    }
 
 
}
 
}
 
void getWord(char *mas)
{
    int c;
    for (int i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
        mas[i] = c;
}
 
void SendMessageToClient(int ID)
{
    char *buffer = new char[1024];
    char buffer[MAX_PATH];
    for (;; Sleep(75))
 
    {
 
        if (recv(Connections[ID], buffer, MAX_PATH, NULL))
        {
            printf("Сообщение: %s", buffer);
            printf("\n");
            for (int i = 0; i <= ClientCount; ++i)
            {
                send(Connections[i], buffer, MAX_PATH, NULL);
            }
        }
        ZeroMemory(buffer, sizeof(buffer));
    }
 
}
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
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
#include <iostream>
#include <windows.h>
#include <winsock.h>
#include <pthread.h>
 
#pragma comment (lib, "ws2_32.lib")
 
using  std::cout;
using  std::cin;
using  std::endl;
SOCKET Connect;
 
void getWord(char *mas);
 
void RecvToClient()
{
    //char *buffer = new char[1024];
    char *buffer = new char[1024];
    for (;; Sleep(75))
        //while(true)
    {
        memset(buffer, 0, sizeof(buffer));
        if (recv(Connect, buffer, 1024, NULL))
        {
            printf("Сообщение: %s", buffer);
            printf("\n");
            
        }
    }
 
}
 
 
int main()
{
 
    system("chcp < nul 1251");
    cout << "Client: " << endl;
 
    char ip[15];
    u_short port;
    //  char message[MAX_PATH];
    
    cout << "IP: ";
    cin >> ip;
    cout << endl;
 
    cout << "Port: ";
    cin >> port;
    cout << endl;
    
    
    char message[MAX_PATH];
    
    WSAData wsa;
    WORD Version = MAKEWORD(2, 1);
 
    WSAStartup(Version, &wsa);
 
    if (WSAStartup(Version, &wsa) != 0)
    {
 
    cout << "Can't load WSA library." << endl;
 
    }
    else
    {
 
    cout << "WSA library load complite" << endl;
 
    }
 
     Connect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if (Connect == SOCKET_ERROR)
    {
 
    cout << "Ошибка создания сокета" << endl;
 
    }
    else
    {
 
    cout << "Сокет создан" << endl;
 
    }
 
    SOCKADDR_IN Client;
 
    Client.sin_family = AF_INET;
    Client.sin_port = htons(port);
    Client.sin_addr.s_addr = inet_addr(ip);
 
    while (1) // !!!
    {
 
    if (connect(Connect, (SOCKADDR*)&Client, sizeof(Client)))
    {
 
    cout << "Подключен к серверу" << endl;
 
    send(Connect, "Сообщение от клиента: Подключен клиент.", MAX_PATH, 0);
 
    recv(Connect, message, sizeof(message), 0);
 
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)RecvToClient, NULL, NULL, NULL);
    break;
 
    }
 
    }
 
    cout << message << endl;
 
    ZeroMemory(message, sizeof(message));
 
    while (1)
    {
 
    cout << "Введите сообщение серверу" << endl;
    getWord(message);
    send(Connect, message, MAX_PATH, 0);
    ZeroMemory(message, sizeof(message));
    }
 
    
    closesocket(Connect);
    WSACleanup();
    system("pause");
 
    return 0;
 
}
 
void getWord(char *mas)
{
    int c;
    for (int i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
        mas[i] = c;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru