Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
29 / 29 / 4
Регистрация: 08.12.2009
Сообщений: 106

WinSocket - нужна помощь

14.02.2011, 19:32. Показов 1252. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ уже полностью намучился, вот есть пример кода сервера.
Вопрос следующий при получении сообщения "stop", сервер должен корректно закрыть все подключения и завершить работу.

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
  #include <stdio.h>
  #include <stdlib.h>
  #include <winsock2.h>
  #include <windows.h>
  #include "iostream"
  #include "string"
  #pragma comment (lib,"ws2_32.lib") 
 
  #define MY_PORT    3131
 
  DWORD WINAPI NumberClientToConnect(LPVOID client_socket);
 
  int nclients = 0;
 
  using namespace std;
 
  int main(int argc, char* argv[])
  {
    char buff[2048];
  
    if (WSAStartup(0x0202,(WSADATA *) &buff[0])) 
    {
          printf("Error WSAStartup %d\n",WSAGetLastError());
              return -1;
    }
 
    SOCKET mysocket;
   
    if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0)
    {
      printf("Error socket %d\n",WSAGetLastError());
      WSACleanup();
      return -1;
    }
 
 
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_port=htons(MY_PORT);
 
    local_addr.sin_addr.s_addr=0;
 
    if (bind(mysocket,(sockaddr *) &local_addr, sizeof(local_addr)))
    {
      printf("Error bind %d\n",WSAGetLastError());
      closesocket(mysocket);
      WSACleanup();
      return -1;
    }
 
    if (listen(mysocket, 0x100))
    {
      printf("Error listen %d\n",WSAGetLastError());
      closesocket(mysocket);
      WSACleanup();
      return -1;
    }
 
    printf("Ожидание подключений\n");
 
    SOCKET client_socket;
    sockaddr_in client_addr;
 
    int client_addr_size=sizeof(client_addr);
 
  
    while((client_socket=accept(mysocket, (sockaddr *)&client_addr, &client_addr_size)))
    {
      nclients++;
      
      DWORD thID;
      CreateThread(NULL,NULL,NumberClientToConnect,&client_socket,NULL,&thID);
    }
    return 0;
  }
 
 
  DWORD WINAPI NumberClientToConnect(LPVOID client_socket)
  {
    SOCKET my_sock;
    my_sock=((SOCKET *) client_socket)[0];
    char buff[20*2048];
    #define sHELLO "Hello!\r\n"
 
    send(my_sock,sHELLO,sizeof(sHELLO),0);
    int bytes_recv;
    string s;
 
    while((bytes_recv = recv(my_sock,&buff[0],sizeof(buff),0))&& bytes_recv !=SOCKET_ERROR)
    {
        
        s = buff;
        s.erase(s.length()-1);
        
                if(s == "stop")
        {
           WSACleanup();/*?????*/
        }
        else
        {
            s +="\n";
        }
        send(my_sock,s.c_str(),bytes_recv,0);
    }
   
    nclients--; // уменьшаем счетчик активных клиентов
 
    closesocket(my_sock);
    return 0;
  }

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

СРОЧНО НУЖНА ПОМОЩЬ! Нужна информация о тест оборудовании
Доброго времени суток! Интересует информация (книги, статьи, научные статьи, сайты, зарубежная приветствуется) о проектировании...

Помощь нужна
Ребят прошу помогите с акссесом. Намучался уже. Необходимо создать базу данных «Автомагазин», включающую таблицы «Модели автомобилей» (рис....

Нужна помощь
Добрый день. Есть маленькая задача. На половину уже сделана. нужно чтоб одно база даных LOTUS работала через веб интерфейс. Помогите...

1
3 / 3 / 2
Регистрация: 08.01.2011
Сообщений: 22
14.02.2011, 20:59
я лет 100 назад писал в винсоках так что мало что помню
добавь строчку
closesocket(my_sock); выше функции ???? твоей

вот еще тебе код моего сервера (он вырезан из чата (напоминаю код писал лет 100 назад, он рабочий, для примера сойдет , покопайся поразбирайся )


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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
 
#define DEFAULT_PORT 27020
 
int __cdecl main(void) 
{   
    WSADATA wsaData;
    int iResult;
    SOCKET s;
 
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        fputs("WSAStartup failed\n", stdout);
        return 1;
    }
    struct sockaddr_in local;
    memset((struct sockaddr *)&local,0,sizeof(local));
    local.sin_family = AF_INET;
    local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    local.sin_port = htons(DEFAULT_PORT);
 
    s = socket(AF_INET,SOCK_DGRAM,0);
    if (s == INVALID_SOCKET)
    {
        fputs("socket failed\n", stdout);
        WSACleanup();
        return 1;
    }
 
    iResult = bind(s,(struct sockaddr *)&local,sizeof (local));
    if (iResult == SOCKET_ERROR) {
        fputs("bind failed\n", stdout);
        closesocket(s);
        WSACleanup();
        return 1;
    }
    
    struct sockaddr_in peer;
    struct Table
    {
        struct sockaddr_in Adr;
        char name[256];
    };
 
    struct Table Spisok[30];
    int k = 0;
 
    int peerlen;
    peerlen = sizeof(peer);
    char buf[256];
    char fin[10] = "$\n\0";
    for (;;)
    {
        iResult = recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *)&peer, &peerlen);
        if (iResult <0)
        {
            fputs("recvfrom failed\n", stdout);
            closesocket(s);
            WSACleanup();
            return 1;
        }
        bool proverka = true;
        int qw = 0;
        while ((qw<k)&&(proverka))
        {   
            if (Spisok[qw].Adr.sin_addr.S_un.S_addr == peer.sin_addr.S_un.S_addr) 
                proverka = false;
            qw++;
        }
        qw--;
        if (!proverka)
        {
            if ( sendto(s, fin , sizeof(fin)
                        , 0, (struct sockaddr *)&(Spisok[qw].Adr), sizeof(Spisok[qw].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
            char st[256];
            int as;
            for (as=0; buf[as] != '\0' ; as++)
                st[as] = buf[as];
            st[as]='\0';
            if (strcmp(st,"ping users\n") == 0)
            {
                for (int g = 0; g < k; g++)
                {
                    if ( sendto(s, Spisok[g].name, sizeof(Spisok[g].name)
                        , 0, (struct sockaddr *)&(Spisok[qw].Adr), sizeof(Spisok[qw].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                }
                if ( sendto(s, fin , sizeof(fin)
                        , 0, (struct sockaddr *)&(Spisok[qw].Adr), sizeof(Spisok[qw].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
            }
            else if (strcmp(st,"exit\n") == 0)
            {
                char tre[100] = "Server delete you from spisok\n\0";
                if ( sendto(s, tre, sizeof(tre)
                        , 0, (struct sockaddr *)&(Spisok[qw].Adr), sizeof(Spisok[qw].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                if ( sendto(s, fin , sizeof(fin)
                        , 0, (struct sockaddr *)&(Spisok[qw].Adr), sizeof(Spisok[qw].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                for (int d = qw; d < k - 1; d++)
                    Spisok[d] = Spisok[d+1];
                k--;            
            }
            else
            {
                int N = sizeof(st);
                char name[256];
                int g;
                for (g = 0; st[g] != ' ' ; g++) name[g] = st[g];
                name[g] = '\n';
                name[g + 1] = '\0';
                for (int aa = 0; aa< N - g; aa++)
                    st[aa] = st[aa + g + 1];
                st[N - g - 1]= '\0';
 
                bool prov = true;
                int q = -1;
                while ((q<k)&&(prov))
                {   
                    q++;
                    if (strcmp(Spisok[q].name,name)==0)
                        prov = false;
                }
                //отправка сообщения нужному юзеру который находится под номером q в списке
                if (q != k)
                {
                    char ret[100];
                    int kl;
                    for (kl=0;st[kl] != '\0'; kl++)
                        ret[kl] = st[kl];
                    ret[kl] = ' ';
                    kl = kl + 1;
                    ret[kl] = 'f';
                    kl = kl + 1;
                    ret[kl] = 'r';
                    kl = kl + 1;
                    ret[kl] = 'o';
                    kl = kl + 1;
                    ret[kl] = 'm';
                    kl = kl + 1;
                    ret[kl] = ' ';
                    kl = kl + 1;
                    for (int i = 0; Spisok[qw].name[i] != '\0'; kl++,i++)
                        ret[kl] = Spisok[qw].name[i];
                    ret[kl] = '\0';
                    if ( sendto(s, fin , sizeof(fin)
                        , 0, (struct sockaddr *)&(Spisok[q].Adr), sizeof(Spisok[q].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                    if ( sendto(s, ret, sizeof(ret), 0, (struct sockaddr *)&(Spisok[q].Adr), sizeof(Spisok[q].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                    if ( sendto(s, fin , sizeof(fin)
                        , 0, (struct sockaddr *)&(Spisok[q].Adr), sizeof(Spisok[q].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                    char tpu[100] = "message is got\n\0";
                    if ( sendto(s, tpu, sizeof(tpu), 0, (struct sockaddr *)&(Spisok[qw].Adr), sizeof(Spisok[qw].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                    if ( sendto(s, fin , sizeof(fin)
                        , 0, (struct sockaddr *)&(Spisok[qw].Adr), sizeof(Spisok[qw].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                }//юзер не нашелся отправка соотв. сообщения
                else
                {
                    char wer[100] = "no users with such nickname \n";
                    if ( sendto(s, wer , sizeof(wer), 0
                        , (struct sockaddr *)&(Spisok[qw].Adr), sizeof(Spisok[qw].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                    if ( sendto(s, fin , sizeof(fin)
                        , 0, (struct sockaddr *)&(Spisok[qw].Adr), sizeof(Spisok[qw].Adr)) <0)
                    {
                        fputs("sendto failed \n",stdout);
                        closesocket(s);
                        WSACleanup();
                        return 1;
                    }
                }
            }
        }//если такого адреса нет в списке , значит пользователь прислал свой nickmame добавляем его в список
        else
        {
            char st[256];
            int zxz;
            for (zxz=0; buf[zxz] != '\0'; zxz++)
                st[zxz] = buf[zxz];
            st[zxz]='\0';
            strcpy(Spisok[k].name,st);
            Spisok[k].Adr = peer;
            k++;
        }
    }
 
    char gf[100];
    gets(gf);
    WSACleanup();
 
    return 1;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2011, 20:59
Помогаю со студенческими работами здесь

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

Нужна помощь!
Недавно начал изучать микроконтроллеры, наткнулся на книгу Ревича &quot;Программирование микроконтроллеров AVR&quot;, у него есть программа...

Расшифровка номера машины с картинки и видео
Нужна помощь в расшифровке номера машины с картинки и видео. Картинки и видео можете посмотреть в архиве. Кто определить правильно...

Нужна помощь
Собственно проблемы две: 1) У меня имеется сайт ruswarez.info . Домен зарегистрирован около недели назад. Зарегистрирован в около 1200...

Нужна помощь!
В одной из баз есть представление в котором первый столбец &quot;категоризирован&quot;. Т.е. в нем группируются одинаковые значения. У одного из...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
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
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru