Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
60 / 57 / 8
Регистрация: 22.07.2011
Сообщений: 436

Ошибка в использовании сокетов

31.12.2011, 15:51. Показов 909. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Захотел сделать сервер-клиент. Нашёл статью, как можно организовать через winapi. Так вот, если сервер стоит на одном компе с клиентом, то всё получилось без проблем. А если на разных, то никак.
Код Сервера:
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
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <winsock2.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    WORD sockVer;
    WSADATA wsaData;
    int retVal;
 
    sockVer = MAKEWORD(2,2);
 
    WSAStartup(sockVer, &wsaData);
 
    SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(servSock == INVALID_SOCKET)
    {
        cout << "Unable to create socket" << endl;
        getch();
        WSACleanup();
        
        return SOCKET_ERROR;
    }
    SOCKADDR_IN sin;
    sin.sin_family = PF_INET;
    sin.sin_port = 0;
    sin.sin_addr.s_addr = inet_addr("5.5.149.227\0");
 
    retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin));
    if(retVal == SOCKET_ERROR)
    {
        cout << "Unable to bind" << endl;
        WSACleanup();
        getch();
        return SOCKET_ERROR;
    }
 
    retVal = listen(servSock, 10);
    if(retVal == SOCKET_ERROR)
    {
        cout << "Unable to listen" << endl;
        WSACleanup();
        getch();
        return SOCKET_ERROR;
    }
 
    SOCKET clientSock;
 
    clientSock = accept(servSock, NULL, NULL);
 
    if(clientSock == INVALID_SOCKET)
    {
        cout << "Unable to accept" << endl;
        WSACleanup();
        getch();
        return SOCKET_ERROR;
    }
 
    char szReq[100];
    retVal = recv(clientSock, szReq, 100, 0);
 
    if(retVal == SOCKET_ERROR)
    {
        cout << "Unable to recv" << endl;
        getch();
        return SOCKET_ERROR;
    }
    
    cout << "Got the request from client" << endl << szReq << endl;
 
    char szResp[100] = "hi, client";
 
    cout << "Sending response from server" << endl;
    retVal = send(clientSock, szResp, strlen(szResp), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        cout << "Unable to send" << endl;
        getch();
        return SOCKET_ERROR;
    }
 
    closesocket(clientSock);
    closesocket(servSock);
 
    WSACleanup();
    getch();
    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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <conio.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
WORD ver = MAKEWORD(2,2);
    WSADATA wsaData;
    int retVal=0;
 
    WSAStartup(ver,(LPWSADATA)&wsaData);
 
    LPHOSTENT hostEnt;
 
    hostEnt = gethostbyaddr("5.5.149.227", 12, PF_INET);
 
    if(!hostEnt)
    {
        cout << "Unable to collect gethostbyaddr" << endl;
        WSACleanup();
        getch();
        return 1;
    }
 
    //Ñîçäàåì ñîêåò
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(clientSock == SOCKET_ERROR)
    {
        cout << "Unable to create socket" << endl;
        WSACleanup();
        getch();
        return 1;
    }
 
    SOCKADDR_IN serverInfo;
 
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr = *((LPIN_ADDR)*hostEnt->h_addr_list);
    serverInfo.sin_port = htons(1111);
 
    retVal=connect(clientSock,(LPSOCKADDR)&serverInfo, sizeof(serverInfo));
    if(retVal==SOCKET_ERROR)
    {
        cout << "Unable to connect" << endl;
        WSACleanup();
        getch();
        return 1;
    }
    cout << "Connection made sucessfully" << endl;
 
    char *pBuf = "hi, server";
    cout << "Sending request from client" << endl;
    retVal = send(clientSock, pBuf, strlen(pBuf), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        cout << "Unable to send" << endl;
        WSACleanup();
        getch();
        return 1;
    }
 
 
    char szResponse[100];
    retVal = recv(clientSock, szResponse, 100, 0);
 
    if(retVal == SOCKET_ERROR)
    {
        cout << "Unable to recv" << endl;
        WSACleanup();
        getch();
        return 1;
    }
    cout << "Got the response from server" << endl << szResponse << endl;
 
    closesocket(clientSock);
    WSACleanup();
    getch();
    return 0;
}
Ошибка происходит тут: hostEnt = gethostbyaddr("5.5.149.227", 12, PF_INET); (в локалке я использовал функцию gethhostbyname())
Ошибка не в компиляторе! Её выводит консоль:
C++
1
2
3
4
5
6
7
 if(!hostEnt)
    {
        cout << "Unable to collect gethostbyaddr" << endl;
        WSACleanup();
        getch();
        return 1;
    }
Добавлено через 9 часов 49 минут
Всё, выяснилось, что эту часть можно пропустить.

Добавлено через 13 часов 33 минуты
Возникла новая проблема: попытался засунусть ожидание пользователя в поток, но функция accept() почему-то возвращает INVALID_SOCKET;
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
#include <winsock2.h>
#include <stdio.h>
#include <iostream>
 
using namespace std;
 
 
    WORD sockVer;
    WSADATA wsaData;
    int retVal;
 
    SOCKET servSock;
    SOCKET clientSock[10];
    
int Thread1(LPVOID pParam);
 
 HANDLE hThread1;
 
 DWORD hThread1ID;
 
int main(void)
{ 
    
   sockVer = MAKEWORD(2,2);
   WSAStartup(sockVer, &wsaData); 
    servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(servSock == INVALID_SOCKET)
    {
        cout << "Unable to create socket" << endl;
        WSACleanup();
        getchar();
        return SOCKET_ERROR;
    }
    SOCKADDR_IN sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(1111);
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
 
    retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin));
    if(retVal == SOCKET_ERROR)
    {
        cout << "Unable to bind" << endl;
        WSACleanup();
        getchar();
        return SOCKET_ERROR;
    }
 
 
    retVal = listen(servSock, 10);
    if(retVal == SOCKET_ERROR)
    {
       cout << "Unable to listen" << endl;
        WSACleanup();
        getchar();
        return SOCKET_ERROR;
    }
    
  hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread1, NULL, 0, &hThread1ID);
 
  while(hThread1 != 0 && hThread2 != 0)
  Sleep(100);
 
    closesocket(servSock);
 
    WSACleanup();
    getchar();
    return 0;
}
 
int Thread1(LPVOID pParam)
{
 clientSock[0] = accept(servSock, NULL, NULL);
 
 
    if(clientSock[0] == INVALID_SOCKET)
    {
        cout << "Unable to accept" << endl;
        WSACleanup();
        getchar();
        return SOCKET_ERROR;
    }
 
    char szReq[100]; 
    retVal = recv(clientSock[0], szReq, sizeof(szReq), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        cout << "Unable to recv" << endl;
        getchar();
        return SOCKET_ERROR;
    }
    
    cout << "Got the request from client" << endl << szReq << endl;
 
    char *szResp = "hi, client";
 
    cout << "Sending response from server" << endl;
    retVal = send(clientSock[0], szResp, strlen(szResp), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        cout << "Unable to send" << endl;
        getchar();
        return SOCKET_ERROR;
    }
 
    closesocket(clientSock[0]);
    hThread1 = 0;
    
    return 0;
   }
Добавлено через 18 минут
Выяснилось, что в каждом потоке нужно снова инициализировать сокет. Но неужели для каждого пользователя свой сокет?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.12.2011, 15:51
Ответы с готовыми решениями:

Ошибки линковщика при использовании сокетов
Доброго времени суток! При попытки скомпилировать код, линковшик выдает ошибки. Хотелось бы узнать: Почему и как это убрать? Код: ...

Буфер данных при использовании сокетов
Всем привет! На что влияет буфер при отправлении и получении данных через сокеты? byte bytes = new byte; Как я понимаю, если сделать...

Проблема при использовании сокетов с русскими буквами.
ДЕЛО В ТОМ ЧТО ПРИ ПЕРДАЧИ ДАННЫХ МЕЖДУ КЛИЕНТОМ И СЕРВЕРОМ ИСПОЛЬЗУЮТСЯ ТАКИЕ ЗАМОРОЧКИ КАК ПОТОКИ ВВОДА/ВЫВОДА ДАННЫХ ... КАК ЖЕ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2011, 15:51
Помогаю со студенческими работами здесь

Ограничение скорости передачи данных при использовании сокетов.
Требуется передавать большие объемы данных от сервера клиенту (коих одновременно может быть несколько). Каким образом можно ограничить...

Отличие Web сокетов от сокетов в Boost Asio
Здравствуйте, Кто нибудь может пожалуйста подсказать, есть ли различие между WebSocket и сокетами в Boost asio и если есть, то в чем...

Ошибка сокетов: D/AndroidRuntime: Shutting down VM
Пишу сокет-клиент. Вроде всё делаю правильно... tvOut.setText(&quot;Коннектимся...&quot;); Log.d(&quot;my&quot;,...

Ошибка при использовании vector (в конце, после вывода результатов выскакивает ошибка, но сам результат коректен)
Суть в следующем, мы считываем введеные значения и выводим этот массив Проблема такова что массив выводиться, корректно, но в конце...

Ошибка в использовании библиотеки/ошибка в библиотеке
Изучаю Java, написал библиотеку для рисования некоторых геометрических фигур (точка, круг, квадрат, прямоугольник, эллипс, треугольник)....


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru