Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/55: Рейтинг темы: голосов - 55, средняя оценка - 4.75
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649

Работа с сокетами. Создание сокета сервера

18.11.2011, 11:50. Показов 11898. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проверьте, пожалуйста программу (она еще не дописана до конца), выскажите замечания.

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
#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <iostream.h>
 
#pragma comment(lib,"ws2_32.lib")
 
 
int main (void)
{
    //Èíèöèàëèçèðóåì áèáëèîòåêó WinSock ñ ïðîìîùüþ âûçîâà ôóíêöèè WSAStartup 
    
    WSADATA wsaData;
 
    if (WSAStartup (MAKEWORD(2,2), &wsaData)==0) 
    {
        //Ôóíêöèÿ âîçâðàùàåò íóëåâîå çíà÷åíèå, èíèöèàëèçàöèÿ óäàëàñü
        // Ïðîâåðÿåì åñëè ñòàðøàÿ âåðñèÿ áîëüøå èëè ðàâíà òðåáóåìîé
        if (LOBYTE (wsaData.wVersion) >= 2)
        {
            //Âûçûâàåì ðàçëè÷íûå WinSock ôóíêöèè
        }
        else
        {
            //Òðåáóåìàÿ âåðñèÿ íåäîñòóïíà
        }
 
        //Îñâîáîæäàåì WinSock
        if (WSACleanup () !=0)
        {
            //Îñâîáîæäåíèå íå óäàëîñü
        }
    }
    else
    {
        //Ôóíêöèÿ âîçâðàùàåò íåíóëåâîå çíà÷åíèå, èíèöèàëèçàöèÿ íå óäàëàñü
    }
    
    //Ñîçäàíèå ñîêåòà Server
    SOCKET Server;
        Server = socket (AF_INET, SOCK_STREAM, 0);
        //AF_INET ïðîòîêîë Èíòåðíåòà (IP)
        //SOCK_STREAM ïîòîêîâûé ñîêåò
        //0 ïî óìîë÷àíèþ âûáèðàåòñÿ TCP ïðîòîêîë
    
    //Åñëè íå óäàëîñü ñîçäàòü ñîêåò
    if (Server==INVALID_SOCKET)
    {
        cout << "Error socket " << WSAGetLastError() <<"\n";
        WSACleanup (); // Äåèíèöèàëèçàöèÿ áèáëèîòåêè WinSock
        return -1;
 
    }
    
    //Ñâÿçûâàíèå ñîêåòà Server ñ ëîêàëüíûì àäðåñîì (IP-àäðåñ óçëà è íîìåð ïîðòà)
    sockaddr_in ServerAddr;
    ServerAddr.sin_family = AF_INET;
    ServerAddr.sin_port = htons(8000);
    ServerAddr.sin_addr.S_un.S_addr = inet_addr("192.168.2.80");
    
    if (bind (Server, (sockaddr*)&ServerAddr, sizeof(ServerAddr)))
    {
        //Ôóíêöèÿ âîçâðàùàåò íåíóëåâîå çíà÷åíèå, îøèáêà
        cout << "Error socket " << WSAGetLastError() <<"\n";
        closesocket(Server); //Çàêðûâàåì ñîêåò Server
        WSACleanup (); // Äåèíèöèàëèçàöèÿ áèáëèîòåêè WinSock
        return -1;
    }   
 
    //Ïåðåâîä ïîòîêîâîãî ñåðâåðà â ðåæèì îæèäàíèÿ ïîäêëþ÷åíèé êëèåíòà
    if (listen (Server, SOMAXCONN)) //SOMAXCONN óñòàíàâëèâàåò ìàêñèìàëüíîå êîëè÷åñòâî îæèäàåìûõ ñîåäèíåíèé
    {
        //Ôóíêöèÿ âîçâðàùàåò íåíóëåâîå çíà÷åíèå, îøèáêà
        cout << "Error socket" << WSAGetLastError() <<"\n";
        closesocket(Server); //Çàêðûâàåì ñîêåò Server
        WSACleanup (); // Äåèíèöèàëèçàöèÿ áèáëèîòåêè WinSock
        return -1;
    }
    cout << "Waiting...\n";
 
    SOCKET Client; //Ñîêåò äëÿ êëèåíòà
    sockaddr_in ClientAddr; // Àäðåñ êëèåíòà (çàïîëíÿåòñÿ ñèñòåìîé)
 
    int ClientAddrSize = sizeof(ClientAddr);
 
    //Ïîäòâåðæäåíèå ïîäêëþ÷åíèÿ êëèåíòà ê ñîêåòó Server
    Client = accept(Server, (sockaddr*)&ClientAddr, &ClientAddrSize);
    if (Client==INVALID_SOCKET)
    {
        //Äåéñòâèÿ â ñëó÷àå îøèáêè
    }
 
 
 
return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2011, 11:50
Ответы с готовыми решениями:

Определить отключение сокета от сервера
Нашёл пару тем на форуме но не понял как сделать :) Там написано что при нормальном отключение сервер шлёт сообщение длиной 0 байт, но как...

Считывание ответа сервера из сокета
Всем добрый вечер! Недавно начал работать с сокетами и почти сразу столкнулся с проблемой - не могу считать ответ сервера. Функция recv()...

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

42
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 15:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Van111 Посмотреть сообщение
Q&ss
Цитата Сообщение от Van111 Посмотреть сообщение
Q &ss
АААААААААААААААААААААААААААААААААААААААА ААА
1
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
19.11.2011, 15:33
Цитата Сообщение от niXman Посмотреть сообщение
именовать функции/переменные/классы в верхнем регистре нельзя. это привилегия исключительно макросов и тайпдефов.
а если я так сделал что должно было случится?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 15:34
Цитата Сообщение от Van111 Посмотреть сообщение
ребята спокойней
как удавы. этим нас не испугаешь. такого повидали в разделе новичков, что хватит детям страшилки всю жизнь рассказывать.
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
19.11.2011, 15:36
Цитата Сообщение от niXman Посмотреть сообщение
Q &ss
Q эт же макрос

Добавлено через 1 минуту
и вообще я этот код три месяца назад писал до начала изучения страуструпа
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 15:36
Цитата Сообщение от Van111 Посмотреть сообщение
что должно было случится?
не должно - а могло.
стандартная ситуация: ты работая где-то, накодил огромную кучи "этава". потом тебя успешно уволили. но прогер который после тебя будет разгребать твое "эта", может запросто встретить тебя в переулке и сделать "хужа этава". забавно?
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.11.2011, 15:39
ребята спокойней
Да хрен бы с ними с макросами как таковыми. Но вот то, что они однобуквенные...
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
19.11.2011, 15:39
Цитата Сообщение от niXman Посмотреть сообщение
может запросто встретить тебя в переулке и сделать "хужа этава"
ты в этом так уверен, зря (я очень сильно не похож на ботана который целый день сидит за компом)
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 15:40
Цитата Сообщение от Van111 Посмотреть сообщение
Q эт же макрос
я понял что макрос.
но у макроса должно быть внятное имя. и в добавок, макросы лучше воспринимаются если их использование аналогично функции:
C++
1
2
3
4
5
6
7
#define MEGA_CAST(arg) ((void*)(arg))
 
...
 
 
int v = 33;
void* ip = MEGA_CAST(&v);
разве так не повышается читаемость?
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
19.11.2011, 15:40
ForEveR, ну и чё я знаю состояния своего кода не нравится перепишете
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.11.2011, 15:41
Van111, Это адский быдлокод. Хотите стать программистом - никогда не пишите такого. А коль пишите на С++ - макросы вообще использовать бессмысленно в большинстве случаев.
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
19.11.2011, 15:42
Цитата Сообщение от niXman Посмотреть сообщение
стандартная ситуация: ты работая где-то, накодил огромную кучи "этава". потом тебя успешно уволили
да чё за брет мне 15 лет какая нафиг работа я б на тебя в твои 15 посмотрел мне до твоего опыта лет десять так что акстись
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 15:46
Цитата Сообщение от Van111 Посмотреть сообщение
не похож на ботана
фиолетово

Добавлено через 2 минуты
Van111, вообще, на твоем месте, я бы прислушался к подобной критике. это ведь не стеб.
ведь как известно, люди не воспринимающие критику, обречены на бесконечное повторение ошибок.
1
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
19.11.2011, 16:12  [ТС]
Ок, допустим, сейчас программа находится в таком состоянии

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
#include <stdlib.h>
#include <stdio.h>
 
#include <winsock2.h>
#include <windows.h>
 
#include <iostream.h>
 
#pragma comment(lib,"ws2_32.lib")
 
int main (void)
{
    //Инициализируем библиотеку WinSock с промощью вызова функции WSAStartup 
    
    WSADATA wsaData;
 
    if (WSAStartup (0x0202, &wsaData)) 
    {
        //Функция возвращает ненулевое значение, инициализация не удалась
        cout << "Error WSAStartup " << WSAGetLastError() <<"\n";
        return -1;
    }
    
    //Создание сокета Server
    SOCKET Server;
    Server = socket (AF_INET, SOCK_STREAM, 0); 
        //AF_INET протокол Интернета (IP)
        //SOCK_STREAM потоковый сокет
        //0 по умолчанию выбирается TCP протокол
        
    if (Server == INVALID_SOCKET)
    {
        //Если не удалось создать сокет
        cout << "Socket failed " << WSAGetLastError() <<"\n";
        WSACleanup (); // Деинициализация библиотеки WinSock
        return -1;
 
    }
    
    //Связывание сокета Server с локальным адресом (IP-адрес узла и номер порта)
    sockaddr_in ServerAddr;
    ServerAddr.sin_family = AF_INET;
    ServerAddr.sin_port = htons(8000); 
    /*htons преобразует номер порта из порядка байтов локальной машины в сетевой порядок байт*/
    //ServerAddr.sin_addr.S_un.S_addr = inet_addr("192.168.2.80");
    //ServerAddr.sin_addr.S_un.S_addr = INADDR_ANY;
    ServerAddr.sin_addr.s_addr = inet_addr("192.168.2.80"); 
            
    if (bind (Server, (sockaddr*)&ServerAddr, sizeof(ServerAddr)))
    {
        //Функция возвращает ненулевое значение, ошибка
        cout << "Bind failed " << WSAGetLastError() <<"\n";
        closesocket(Server); //Закрываем сокет Server
        WSACleanup (); // Деинициализация библиотеки WinSock
        return -1;
    }   
 
    //Перевод потокового сервера в режим ожидания подключений клиента
    if (listen (Server, 1))
    {
        //Функция возвращает ненулевое значение, ошибка
        cout << "Listen failed " << WSAGetLastError() <<"\n";
        closesocket(Server); //Закрываем сокет Server
        WSACleanup (); // Деинициализация библиотеки WinSock
        return -1;
    }
 
    cout << "Waiting...\n";
 
    SOCKET Client; //Сокет для клиента
      sockaddr_in ClientAddr; // Адрес клиента (заполняется системой)
 
    int ClientAddrSize = sizeof(ClientAddr);
 
    //Подключение клиента к сокету Server
    Client = accept(Server, (sockaddr*)&ClientAddr, &ClientAddrSize);
    if (Client==INVALID_SOCKET)
    {
        //Действия в случае ошибки
        cout << "Accept failed " << WSAGetLastError() <<"\n";
        closesocket(Server); //Закрываем сокет Server
        WSACleanup (); // Деинициализация библиотеки WinSock
        return -1;
    }
 
    
closesocket (Server);
 
WSACleanup ();
 
return 0;
}
Т.е программа сейчас заканчивается на приеме клиента

По заданию сервер и клиент должны обмениваться такими сообщениями.
Как запрограммировать этот массив сообщений?
Хотя бы на одном примере объясните?
Вложения
Тип файла: pdf задание.pdf (53.5 Кб, 20 просмотров)
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 16:14
Цитата Сообщение от Heidel Посмотреть сообщение
программа сейчас заканчивается на приеме клиента
и правильно. после подключения следует closesocket().

Цитата Сообщение от Heidel Посмотреть сообщение
Как запрограммировать этот массив сообщений?
для этого создайте отдельную тему.
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
19.11.2011, 16:19
Цитата Сообщение от Heidel Посмотреть сообщение
Как запрограммировать этот массив сообщений?
C++
1
2
3
4
5
6
if ((accept(Server, (sockaddr*)&ClientAddr, &ClientAddrSize)))
{
send(client,"здоров",7,0);
send(client,"привет",7,0);
//...................
}
 Комментарий модератора 
Пользуемся тегами кода!
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 16:21
Цитата Сообщение от Van111 Посмотреть сообщение
if ((accept(Server, (sockaddr*)&ClientAddr, &ClientAddrSize)));
точка-запятая в конце.
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
19.11.2011, 16:32
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
#include "winsock2.h"
#include "stdio.h"
#include "string.h"
 
 
DWORD WINAPI client(LPVOID cs);
DWORD WINAPI conect(LPVOID ss);
 
int main()
{
    WSADATA wsa;
    WSAStartup(0x202,&wsa);
    int n;
    SOCKET s;
    sockaddr_in ss;
    s=socket(AF_INET,SOCK_STREAM,0);
    ss.sin_family=AF_INET;
    ss.sin_port=htons(666);
    ss.sin_addr.s_addr=INADDR_ANY;
    bind(s,(sockaddr*) &ss,sizeof(ss));
    listen(s,5);
    DWORD thID;
    CreateThread(0,0,conect,&s,0,&thID);
label:
    system("pause");
    goto label;
        return 0;   
}
 
DWORD WINAPI conect(LPVOID ss)
{
DWORD thID;
SOCKET cs;
sockaddr_in css_in;
int size_css_in=sizeof(css_in);
while((cs=accept(((SOCKET*)ss)[0],(sockaddr*) &css_in,&size_css_in)))
    CreateThread(0,0,client,&cs,0,&thID);}  
 
 
DWORD WINAPI client(LPVOID cs)
{
char str=0;
SOCKET s=((SOCKET*)cs)[0];
timeval tim;
fd_set rv,re;
tim.tv_sec=0;
tim.tv_usec=100;
FD_ZERO(&rv); FD_ZERO(&re);
FD_SET(s,&rv); FD_SET(s,&re);
select(s,&rv,0,&re,0);
[COLOR="Red"] for(;;)
{
      if(FD_ISSET(s,&rv))
      {
        if(recv(s,&str,1,0))
        printf("%c",str);
        else break;
      }
      if(FD_ISSET(s,&re))
      return 0;
 
} [/COLOR]
return 0;   
}
посмотрите то что выделено красным как сделать так чтоб при разрыве соединения поток закрывался а не повторял один и тот же символ бесконечно
0
 Аватар для Heidel
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
19.11.2011, 16:42  [ТС]
Создала https://www.cyberforum.ru/cpp-... 87180.html

Van111,
C++
1
2
3
4
5
6
if ((accept(Server, (sockaddr*)&ClientAddr, &ClientAddrSize)))
{
send(client,"здоров",7,0);
send(client,"привет",7,0);
//...................
}
Вы уверены, что тут все правильно?
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
19.11.2011, 16:57
C++
1
2
3
4
5
6
if ((accept(Server, (sockaddr*)&ClientAddr, &ClientAddrSize)))
{
send(Сlient,"здоров",7,0);
send(Сlient,"привет",7,0);
//...................
}
Цитата Сообщение от Heidel Посмотреть сообщение
Вы уверены, что тут все правильно?
а что к серваку подключились он отослал здоров ,привет главное чтоб вы их правильно приняли ну например принимаются вот так
C++
1
2
3
char *str=new char[1024],int n;
n=recv(server,str,sizeof(str)-1,0);
str[n]=0; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!если это строка
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
19.11.2011, 17:05
Цитата Сообщение от Heidel Посмотреть сообщение
Вы уверены, что тут все правильно?
тебе это не нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2011, 17:05
Помогаю со студенческими работами здесь

Использование сокета в качестве сервера или клиента по ситуации
В большинстве клиент-серверных приложений сначала запускают сервер , затем клиентов. Но захотелось автоматизации , те автоматического...

Из-за чего событие чтение сокета у сервера может вызываться бесконечно?
Из за чего событие чтение у сервера может вызываться бесконечно? Если закрыть клиент как программу, то событие чтения на сервере вылетает...

Работа с сокетами
как вырубить локальный клиент?

Работа с сокетами
Доброго времени суток уважаемые форумчане. Давно хотел заняться изучением работы с сокетами в Делфи, и вот наконец-то руки дошли. Сразу...

Работа с сокетами
Пишу распределенное приложение. Сервер должен реагировать на множество клиентов. Для сервера написал что-то такое : server =...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru