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

Что я делаю не так?

09.06.2011, 16:21. Показов 1449. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане!
У меня не получается написать консольное приложение клиент-сервер, задача которого передать сообщение от сервера к клиенту, и от клиента к серверу. Код вроде бы правильный (компилятор находит одну ошибку в сервере (в коде указана), но думаю она здесь не причем), такое впечатление, что но клиент и сервер не находят друг друга. Компилировал код в C++Builder 6.0, клиент и сервер запускаются, но виснут, клиент виснет на функции recv(), сервер виснет на - accept(). Не пойму почему это происходит, уже 3 дня мучусь. Может дело не в коде? Тогда в чем? Подскажите кто-нибудь, что я делаю не так? Вот сам код:
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
//Клиент:
 
#include <vcl.h>
#pragma hdrstop
#pragma argsused
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <winsock2.h> // Включаем использование сокетов 
#define PORT 9911     //  Порт, через который идет подключение к серверу
//#define SERVERADDR "95.81.47.241" //Адрес сервера (ip моего компа) // пробовал и так, и так как ниже
#define SERVERADDR "127.0.0.1"     //Адрес сервера... все равно никак
#pragma comment(lib, "WS2_32.LIB")
#include <windows.h>
//---------------------------------------------------------------------------
using namespace std;
 
void main()
{
    WSADATA wsa_data; // Информация о сокетах
    SOCKET s; // Серверный сокет
    s = NULL;
 
    // 1. Инициализируем сокеты (требуем версию 1.1 как минимум)
    if (WSAStartup(0x101,&wsa_data) != 0)
    {
        cout << "Error: " << WSAGetLastError();
        return;
    }
 
    // 2. Открываем серверный сокет
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s == INVALID_SOCKET)
    {
        cout << "Error: " << WSAGetLastError();
        return;
    }
 
    // 3. Привязываем сокет к адресу
    sockaddr_in addr; // Для хранения адреса
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    //addr.sin_addr.S_un.S_addr = inet_addr("95.81.47.241");
    addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(9911); // Наш порт, который будем открывать для коннектов
 
    if (bind(s,(LPSOCKADDR)&addr,sizeof(addr)) != 0)
    {
        cout << "Error: " << WSAGetLastError();
        return;
    }
 
    //4. Соединяемся
    if (connect(s,(LPSOCKADDR)&addr,sizeof(addr)) == SOCKET_ERROR)
    {
        cout << "Error: " << WSAGetLastError();
        return;
    }
 
    // 5. Обмениваемся данными
    // (получаем приветствие)
    char buf[1024];
    int len = recv(s, buf, 1024, 0); // <--- здесь виснет!!!
    if (len == SOCKET_ERROR) return;
 
    buf[len] = 0;
    // Отсылаем ответ серверу
    char *reply = "Fuck you too, buddy!";
    send(s, reply, (int)strlen(reply), 0);
 
    // 6. Закрываем сокет
    closesocket(s);
 
    // 7. Завершаем работу с сокетами
    WSACleanup();
}
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
//Сервер:
 
#include <vcl.h>
#include <iostream>
#include <winsock2.h> // Включаем использование сокетов
#pragma comment(lib, "WS2_32.LIB")
#define SRV_PORT 9911
 
using namespace std;
void main()
{
    WSADATA wsa_data; // Информация о сокетах
    SOCKET s; // Серверный сокет
    s = NULL;
    // 1. Инициализируем сокеты (требуем версию 1.1 как минимум)
    if (WSAStartup(0x101,&wsa_data) != 0)
    {
        cout << "Error: " << WSAGetLastError();
        return;
    }
 
    // 2. Открываем серверный сокет
    s = socket(AF_INET, SOCK_STREAM, /*0*/IPPROTO_TCP);
    if (s == INVALID_SOCKET)
    {
        cout << "Error: " << WSAGetLastError();
        return;
    }
 
    // 3. Привязываем сокет к адресу
    struct sockaddr_in addr; // Для хранения адреса
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.S_un.S_addr = INADDR_ANY;
    addr.sin_port = htons(9911); // Наш порт, который будем открывать для коннектов
    addr.sin_port = SRV_PORT;
 
    if (bind(s,(LPSOCKADDR)&addr,sizeof(addr)) == SOCKET_ERROR/*!= 0*/)
    {
        cout << "Error: " << WSAGetLastError();
        return;
    }
 
    // 4. Устанавливаем сокет в режим прослушивания
    if (listen(s,1) == SOCKET_ERROR/*!= 0*/)
    {
        cout << "Error: " << WSAGetLastError();
        return;
    }
 
    // 5. Бесконечный цикл получения соединений
    while(true)
    {
    // Принимаем соединения от клиентов
        int from_len;
        SOCKET client_socket; // Сокет клиента
        sockaddr_in client_addr; // Адрес клиента
        from_len = sizeof(client_addr);
 
        //client_socket = accept(s,(LPSOCKADDR)&client_addr, &from_len);
        client_socket = accept(s,(struct sockaddr*)&client_addr, &from_len); // <--- здесь виснет!!!
 
        // Проверяем ошибочность соединения
        if (client_socket == INVALID_SOCKET) continue; // Если что опять переходим в режим ожидания соединения
 
        cout << "Client connected [" << inet_ntoa(client_addr.sin_addr) << "]..." << endl;
 
        // Отсылаем "приветствие" подключившемуся клиенту
        char *greeting = "Fuck off!!!";
        send(client_socket, greeting, (int)strlen(greeting),0);
 
        // Получаем ответ клиента
        char buf[1024];
        int len = recv(client_socket, buf, 1024, 0);
        if (len != SOCKET_ERROR)
        {
            buf[len] = 0; // Не забываем ставить терминирующий ноль (если мы строку принимаем)
            cout << buf << endl;
        }
        // Закрываем сокет
        closesocket(client_socket);
        // Переходим к следующему клиенту
        cout << "...disconnected" << endl;
    }
    // 6. Закрываем серверный сокет
    closesocket(s);  // <--- [C++ Warning] Unit1.cpp(85): W8066 Unreachable code !!!
 
    // 7. Завершаем работу с сокетами
    WSACleanup();
    return;
}
буду рад любой помощи!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.06.2011, 16:21
Ответы с готовыми решениями:

Метафайлы. Что я не так делаю?
TMetafile *Metafile; TRect Rect; Rect.left=0; Rect.right=297*Resolution-1; Rect.top=0; Rect.bottom=210*Resolution-1; ...

Не работает программа. Что я делаю не так
Короче, программа нахождения суммы целых частей элементов массива, расположенных после последнего отрицательного элемента. Почему-то не...

Билдер ругается на функцию, что делаю не так ?:(
Ругается чтот на функцию,пишет Unit1.cpp(122): E2141 Declaration syntax error не нравится компилятору { тут float vuborK(float ...

4
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
09.06.2011, 16:47
Как-то писал нечто подобное
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
//клиент
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <wininet.h>
#include <process.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
unsigned __stdcall ThreadReceive(void* s)
{
  int rc;
  char buf[1024];
  do
  {
    memset(&buf,0,sizeof(buf));
    rc=recv(*(SOCKET*)s, buf, sizeof(buf), 0);
    if(rc>0) {
      printf("Recieved: %s\n", buf);
    };
    Sleep(30);
  }while(1);
}
 
unsigned __stdcall ThreadSend(void* s)
{
  char buf[1024];
  do
  {
    memset(&buf, 0, sizeof(buf));
    gets(buf);
    send(*(SOCKET*)s, buf, sizeof(buf),0);
    Sleep(30);
  }while(1);
}
 
#pragma argsused
int main(int argc, char* argv[])
{
  WSADATA wsadata;
  WSAStartup(MAKEWORD(2,2), &wsadata);
  sockaddr_in client;
  SOCKET s;
  char ip[16];
  bool succes;
  do{
  client.sin_family = AF_INET;
  client.sin_port = 80;
  printf("Connect to IP address: \n");
  scanf("%s", ip);
  ip[15] = 0;
  client.sin_addr.S_un.S_addr = inet_addr(ip);
  s = socket(AF_INET, SOCK_STREAM, 0);
  if(s == SOCKET_ERROR)
    printf("Socket error\n");
  if(succes = connect(s, (const sockaddr*)(&client), sizeof(client)) == SOCKET_ERROR)
    printf("Connection failed\n");
  else
    printf("Connection success\n");
  }while(succes);
  unsigned ReceiveThreadID, SendThreadID;
  HANDLE event = CreateEvent(NULL, false, false, NULL);
  _beginthreadex(NULL, 0, &ThreadReceive, &s, 0, &ReceiveThreadID);
  _beginthreadex(NULL, 0, ThreadSend, &s, 0, &SendThreadID);
  WaitForSingleObject(event, INFINITE);
  WSACleanup();
  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
//сервер
//---------------------------------------------------------------------------
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <wininet.h>
#include <process.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
unsigned __stdcall ThreadReceive(void* s)
{
  int rc;
  char buf[1024];
  do
  {
    memset(&buf,0,sizeof(buf));
    rc=recv(*(SOCKET*)s, buf, sizeof(buf), 0);
    if(rc>0) {
      printf("Recieved: %s\n", buf);
    };
    Sleep(30);
  }while(1);
}
 
unsigned __stdcall ThreadSend(void* s)
{
  char buf[1024];
  do
  {
    memset(&buf, 0, sizeof(buf));
    gets(buf);
    send(*(SOCKET*)s, buf, sizeof(buf),0);
    Sleep(30);
  }while(1);
}
#pragma argsused
int main(int argc, char* argv[])
{
  WSADATA wsadata;
  WSAStartup(MAKEWORD(2,2), &wsadata);
  sockaddr_in host;
  SOCKET s,s1;
  //char* addr = "127.0.0.1\0";
  host.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr(addr);
  host.sin_family = AF_INET;
  host.sin_port = 80;
  s = socket(AF_INET, SOCK_STREAM, 0);
  if(s == SOCKET_ERROR)
      printf("socket error");
  bind(s, (const sockaddr*)(&host), sizeof(host));
  listen(s, 5);
  //do{
  int size = sizeof(host);
  s1 = accept(s, (sockaddr*)&host, &size);
  send(s1, "Hello", 5, 0);
  UINT SendThreadID, ReceiveThreadID;
  _beginthreadex(NULL, 0, &ThreadReceive, &s1, 0, &ReceiveThreadID);
  _beginthreadex(NULL, 0, &ThreadSend, &s1, 0, &SendThreadID);
  HANDLE event = CreateEvent(NULL, false, false, NULL);
  WaitForSingleObject(event, INFINITE);
  return 0;
}
//---------------------------------------------------------------------------
Давно правда, но если че не понятно спрашивай - попробую вспомнить
1
0 / 0 / 0
Регистрация: 31.03.2011
Сообщений: 15
09.06.2011, 16:56  [ТС]
-LeV-, ок спасиба, попытаюсь разобраться....
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
09.06.2011, 17:10
ya2791 в Клиент.cpp перед биндом нужно порт клиента указать, а не сервера, например:
addr.sin_port = htons(9901);
а также после бинда нужно подсоединиться к серверу, т.е. изменить порт на порт сервера:
addr.sin_port = htons(9911);

в Сервер.cpp нужно только убрать эту строку:
addr.sin_port = SRV_PORT;

Вообще, это лучше делать вместе с программой-монитором, отображающей сетевые соединения, например, TCPView.
1
0 / 0 / 0
Регистрация: 31.03.2011
Сообщений: 15
09.06.2011, 17:15  [ТС]
-LeV-, огромное спасибо, ваш код работает отлично.
kzru_hunter, вам тоже спасибо, обязательно учту ваши советы =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.06.2011, 17:15
Помогаю со студенческими работами здесь

Метафайлы, часть не влазит. Что я не так делаю?
TMetafile *Metafile; TCanvas *BufferCanvas; TRect Rect; int t; int b; int i; AnsiString s; Rect.left=0; ...

Не получается построить график в Tchart. Что не так делаю ?
Не получается построить график в Tchart. Что не так делаю ? void __fastcall TForm1::Button1Click(TObject *Sender) { //TDateTime...

Мусорное значение в динамическом массиве в структуре. Что я делаю не так?
Здравствуйте! Делаю вычисление факториала от 21 до 30. Использую длинную арифметику. Произведение длинного и короткого чисел -...

Создание массива компонентов edit, его инициализация и передача в функцию. Что я делаю не правильно?
Всем доброго времени суток. В общем, хочу написать функцию очистки Edit-ов. У меня в проекте есть отдельный юнит где я прописываю все...

Лучший интерактивный самоучитель с++, но так понравился, что думаю, а что если после python изучать с++?
http://academy.cppstudio.com/courses/ 1.) поделитесь опытом после какого языка вы перешли на с++. 2.) Что вам нравится/не очень в языке...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru