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

TCP-эхо клиент-сервер (WinSock)

30.11.2014, 17:16. Показов 9413. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста, почему TCP-эхо клиент-сервер неправильно работает? Сервер отправляет клиенту правильно только первую принятую от него строку , все остальные строки с глюками, клиенту приходит совсем не то, что отправлялось, и через ~20 циклов приема-передачи клиент уже ничего не отправляет.

СЕРВЕР

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
//  TCP – ЭХО СЕРВЕР
 
  #include <stdio.h>
  #include <winsock2.h>   
         
  #include <windows.h>
 
  #define MY_PORT    1234
  #define PRINTNUSERS if (nclients)\
  printf("%d user on-line\n",nclients);\
  else printf("No User on line\n");
 
  DWORD WINAPI SexToClient(LPVOID client_socket); 
  int nclients = 0;
 
  int main()
  {
    char buff[1024];   
 
    printf("TCP SERVER DEMO\n");
    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, 4))
    {
      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++;    
      HOSTENT *hst;
      hst=gethostbyaddr((char *)&client_addr.sin_addr.s_addr,4, AF_INET);
      printf("+%s [%s] new connect!\n", (hst)?hst->h_name:"", inet_ntoa(client_addr.sin_addr));
      PRINTNUSERS
     DWORD thID;
      CreateThread(NULL,NULL,SexToClient,&client_socket,NULL,&thID);
    }
    return 0;
  }
  DWORD WINAPI SexToClient(LPVOID client_socket)
  {
    SOCKET my_sock;
    my_sock=((SOCKET *) client_socket)[0];
    char buff[20*1024];
    #define sHELLO "Hello, Sailor\r\n" 
    send(my_sock,sHELLO,sizeof(sHELLO),0);
    int bytes_recv;
    bytes_recv = recv(my_sock,&buff[0],sizeof(buff),0);
    while(bytes_recv!=SOCKET_ERROR)
      send(my_sock,&buff[0],bytes_recv,0);
    nclients--; 
    printf("-disconnect\n"); PRINTNUSERS
    closesocket(my_sock);
    return 0;
  }
КЛИЕНТ

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
//  TCP КЛИЕНТ
  #include <stdio.h>
  #include <string.h>
  #include <winsock2.h>
  #include <windows.h>
  #define PORT 1234
  #define SERVERADDR "127.0.0.1"
 
  int main(int argc, char* argv[])
  {
    char buff[1024];
    printf("TCP DEMO CLIENT\n");
    if (WSAStartup(0x0202,(WSADATA *)&buff[0]))
    {
      printf("WSAStart error %d\n",WSAGetLastError());
      return -1;
    }
    SOCKET my_sock;
    my_sock=socket(AF_INET,SOCK_STREAM,0);
    if (my_sock < 0)
    {
      printf("Socket() error %d\n",WSAGetLastError());
      return -1;
    }
    sockaddr_in dest_addr;
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);
    HOSTENT *hst;
    if (inet_addr(SERVERADDR)!=INADDR_NONE)
      dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    else
      if (hst=gethostbyname(SERVERADDR))
      ((unsigned long *)&dest_addr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
      else 
      {
        printf("Invalid address %s\n",SERVERADDR);
        closesocket(my_sock);
        WSACleanup();
        return -1;
      }
    if (connect(my_sock,(sockaddr *)&dest_addr,sizeof(dest_addr)))
    {
      printf("Connect error %d\n",WSAGetLastError());
      return -1;
    }
    printf("?????????? ? %s ??????? ???????????\n\
    Type quit for quit\n\n",SERVERADDR);
    int nsize;
    while((nsize=recv(my_sock,&buff[0],sizeof(buff)-1,0))!=SOCKET_ERROR)
    {
      buff[nsize]=0;
      printf("S=>C:%s",buff);
      printf("S<=C:"); fgets(&buff[0],sizeof(buff)-1,
             stdin);
      if (!strcmp(&buff[0],"quit\n"))
      {
       
        printf("Exit...");
        closesocket(my_sock);
        WSACleanup();
        return 0;
      }
      send(my_sock,&buff[0],nsize,0);
    }
    printf("Recv error %d\n",WSAGetLastError());
    closesocket(my_sock);
    WSACleanup();
    return -1;
  }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2014, 17:16
Ответы с готовыми решениями:

Эхо сервер без Qt, Boost и тп (TCP/UDP)
Добрый день! Стоит задача - реализовать эхо сервер (клиент-серверное приложение), которое будет принимать пакеты по протоколу UDP/TCP...

как создать TCP клиент, TCP сервер ? На С++
Очень нужна помощь!Как написать TCP клиент, TCP сервер. Например,клиент вводит строку с клавиатуры и отсылает ее серверу.только перед...

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,...

5
3 / 3 / 3
Регистрация: 28.03.2013
Сообщений: 45
30.11.2014, 18:15
Возможно что между передачами нужна пауза. Потому что сообщения не отправлюятся мгновенно. Все зависит от канала. Даже если сервер и клиент запущены на одном ПК, то все равно приходится ставить паузу на 1 мс. По кройней мере так с классам CSocket. Да и если сообщение большое по объему, то она нарезается кусками и отсылается частями, что так же дает задержку.
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 5
30.11.2014, 18:41  [ТС]
ставил задержку между записью в буфер и выводом на экран у клиента, то же самое. Немного подправил программу, теперь обмениваться сообщениями можно сколько угодно, но на экран клиента все равно после первой строки выводится не то что нужно, хотя в буфер, который отправляет сервер, записывается все правильно.
0
3 / 3 / 3
Регистрация: 28.03.2013
Сообщений: 45
30.11.2014, 19:59
Лучший ответ Сообщение было отмечено dima1996t как решение

Решение

конечно С++ я подзабыл, но почему вы отправляете &buff[0], а не &buff? И почему вы пишете
C++
1
fgets(&buff[0],sizeof(buff)-1, stdin);
Ведь как я помню, то это функция считывает файл stdin и записывает в buff[0]
2
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 5
30.11.2014, 21:49  [ТС]
СПАСИБО ОГРОМНОЕ!!!!ЗАРАБОТАЛО!!!!))))))))))

Добавлено через 1 час 24 минуты
Вопрос не по теме, но может кто-нибудь знает, как освободить память на диске C, которая занимается после выполнения программ на Dev C++?
0
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
23.04.2015, 17:46
Цитата Сообщение от angoli Посмотреть сообщение
конечно С++ я подзабыл, но почему вы отправляете &buff[0], а не &buff? И почему вы пишете
Код C++
1
fgets(&buff[0],sizeof(buff)-1, stdin);
Ведь как я помню, то это функция считывает файл stdin и записывает в buff[0]
Все правильно помните, и почему тогда возникают такие вопросы? stdin - стандартный поток ввода в С. Данный вызов функции - читаем символы, из стандартного потока ввода(то есть то, что пишет пользователь) и записываем их в буфер. Затем то что ввел пользователь передаем серверу...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.04.2015, 17:46
Помогаю со студенческими работами здесь

Написать соединение: много клиентов - сервер (Winsock; на сервере 3 сокета: 2 TCP и 1 UDP)
Всем здрасьте !!!! Мне надо написать соединение: много клиентов - сервер Тут мне надо иметь на сервере 3 сокета: 2 TCP и 1 UDP ...

Клиент сервер Winsock + SDL. Форма клиента зависает
Проблема клиета: Форма SDL зацикливаеться циклом while и создается менюшка с кнопками и текстом тут все хорошо.Winsock тоже зацикливается...

TCP сервер и клиент
Добрый день! Необходимо реализовать TCP сервер, поддерживающий соединения с несколькими клиентами. Сервер должен принимать...

tcp сервер-клиент
Есть 2 проекта: в одном server.cpp, а в другом client.cpp. Что у меня не правильно, следующие ошибки: 1&gt;LINK : warning LNK4067:...

TCP/IP клиент и сервер
Сервер # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include &lt;stdlib.h&gt; # pragma comment (lib,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru