С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811

Многопоточный сервер

25.12.2014, 09:23. Показов 2039. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю многопоточный сервер:

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
#undef UNICODE
 
//#define WIN32_LEAN_AND_MEAN
 
#include "StdAfx.h"
 
#include <iostream>
//#include<thread> //Файл в котором определен класс thread 
#include <winsock2.h>
#include <windows.h>
 
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include <mstcpip.h>
 
using namespace std;
 
 
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
// #pragma comment (lib, "Mswsock.lib")
 
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
 
int смартфон()
{
    setlocale(LC_ALL, "Russian");
    WSADATA wsaData;
    int iResult;
    
    SOCKET ListenSocket = INVALID_SOCKET;
    SOCKET ClientSocket = INVALID_SOCKET;
 
    struct addrinfo *result = NULL;
    struct addrinfo hints;
 
    int iSendResult;
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;
 
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }
 
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
 
    // Resolve the server address and port
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed with error: %d\n", iResult);
        WSACleanup();
        return 1;
    }
 
    // Create a SOCKET for connecting to server
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if (ListenSocket == INVALID_SOCKET) {
        printf("socket failed with error: %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
 
    // Setup the TCP listening socket
    iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);// вот здесь выдает ошибку
    if (iResult == SOCKET_ERROR) {
        printf("bind failed with error: %d\n", WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
 
    freeaddrinfo(result);
 
    iResult = listen(ListenSocket, SOMAXCONN);
    if (iResult == SOCKET_ERROR) {
        printf("listen failed with error: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
 
    // Accept a client socket
    do//цикл извлечения запросов для многопоточности
    {
        ClientSocket = accept(ListenSocket, NULL, NULL);
        if (ClientSocket == INVALID_SOCKET) {
            printf("accept failed with error: %d\n", WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
            return 1;
        }
 
        // No longer need server socket
        //closesocket(ListenSocket);
        cout << "соединение со смартфоном установлено" << endl;
        
    
    } while (true);
    // Receive until the peer shuts down the connection
    do {
        ZeroMemory(recvbuf, sizeof(recvbuf));
        iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
        if (iResult > 0) {
            cout << "iResult= " << iResult << endl;
            cout << "пришел пакет от смартфона: " << recvbuf << endl;
            // Echo the buffer back to the sender
            iSendResult = send(ClientSocket, recvbuf, iResult, 0);
            if (iSendResult == SOCKET_ERROR) {
                printf("send failed with error: %d\n", WSAGetLastError());
                closesocket(ClientSocket);
                WSACleanup();
                return 1;
            }
            printf("Bytes sent: %d\n", iSendResult);
        }
        else if (iResult == 0)
            printf("Connection closing...\n");
        else  {
            printf("recv failed with error: %d\n", WSAGetLastError());
            cout << "соединение закрыто со стороны смартфона" << endl;
            closesocket(ClientSocket);
            WSACleanup();
            return 1;
        }
 
    } while (iResult > 0);
 
    // shutdown the connection since we're done
    iResult = shutdown(ClientSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf("shutdown failed with error: %d\n", WSAGetLastError());
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }
 
    // cleanup
    closesocket(ClientSocket);
    WSACleanup();
 
    return 0;
}
Вопрос в общем то вот в чем, если я подключаю #include<thread> компилятор выдает ошибку:
c:\projects\сервер2.1\сервер2.1\смартфон .cpp(74): error C2440: =: невозможно преобразовать "std::_Bind<false,void,SOCKET &,sockaddr *&,int>" в "int"
Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
2 IntelliSense: не существует подходящей функции преобразования из "std::_Bind<false, void, SOCKET &, sockaddr *&, int>" в "int" c:\Projects\Сервер2.1\Сервер2.1\Смартфон .cpp 74 12 Сервер2.1

А если скомпелить в таком виде то все работает.. клиенты подключаются...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2014, 09:23
Ответы с готовыми решениями:

Многопоточный сервер
Доброго времени суток. Во время новогодних праздников, решил себя развлечь написанием небольшого приложения на C++ под дебианом....

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

Многопоточный ТСР-сервер с использованием WinSock
При написании сервера столкнулся с некоторыми трудностями. Задача: написать ТСР-сервер, который мог бы обслуживать несколько клиентов...

7
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.12.2014, 10:18
using namespace std; удалите, а там где std-шное подпишите std::
видимо компиль путает
C++
1
bind(socket...)
c
C++
1
std::bind<blabla>(bla bla)
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
25.12.2014, 13:29  [ТС]
Прикольно но на самом деле так и получилось, видно визуал 2013 косячит...
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.12.2014, 17:27
не она косячит собсно одна из опасностей записи
C++
1
using namespace std;
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
30.12.2014, 08:37  [ТС]
С наступающим уважаемые форумчане!

продолжаю работать над сервером в свое удовольствие и в свободное время но вот возникла у меня проблемка которую пока не знаю как решить.... Смысл вот в чем: для каждого нового подключения открывается отдельный поток.... там есть функции отправки клиенту данных и приема данных, если с приемом все понятно, данные записываются в массив и их можно прочитать потом из основной функции main, то как мне из основной функции отправить данные одному из подключенных клиентов?
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
30.12.2014, 09:26
что мешает каждому клиенту завести буфер который он будет отправлять?
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
30.12.2014, 12:20  [ТС]
Буфер для отправки есть в том потоке который открылся при подключении клиента, вопрос вот в чем как найти и записать данные в тот буфер и дать команду на отправку ? Данные присылает клиент подключенный к другому порту(клиентов тоже много) так вот надо эти данные обработать решить надо ли отправить и отправить одному из клиентов... Потоки то те что работают с сокетами не вечные, при отключении клиента он проподает....
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
30.12.2014, 13:07
мультиплексированный ввод/вывод Вам в помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2014, 13:07
Помогаю со студенческими работами здесь

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

Многопоточный чат на winsock
Всем доброго времени сутокб смогреализовать сервер проверил его через telnet, но есть проблема с клиентом идея заключается в том чтобы...

Tcp ip клиент-сервер C++ сервер выводит мусор
server # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include &lt;stdlib.h&gt; # pragma comment (lib,...

Многопоточный сервер
Есть код консольного клиента using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; ...

Многопоточный сервер
Понадобилось сделать обработку каждого клиента в отдельном потоке. Вроде нечего сложного, перемещаю созданный класс клиента в отдельный...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru