6 / 8 / 2
Регистрация: 20.12.2012
Сообщений: 729
1

Сокеты: клиент не принимает данные

18.04.2013, 00:36. Показов 1378. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал простой консольный чат. Почему в клиенте функция recv возвращает ошибку 10038?

Сервер:
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 "stdafx.h"
 
#include <iostream>
#include <winsock2.h>
#include <windows.h>
 
using namespace std;
 
DWORD WINAPI threadFunc(PVOID pParam);
SOCKET hSocket;
 
int _tmain(int argc, _TCHAR* argv[])
{
    sockaddr_in sockAddr = {0};
    WSAData wsaData;
 
    char sendBuff[1024];
 
    WSAStartup(MAKEWORD(2, 0), &wsaData);
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_port = htons(10001);
    sockAddr.sin_addr.S_un.S_addr = INADDR_ANY;
    hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    cout << "Socket created\n";
    bind(hSocket, reinterpret_cast<sockaddr*>(&sockAddr), sizeof(sockAddr));
    cout << "Bind\n";
    listen(hSocket, SOMAXCONN);
    cout << "Listen\n";
 
    CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);
 
    while (TRUE) {
        cin >> sendBuff;
        if (sendBuff == "exit")
            break;
        send(hSocket, sendBuff, strlen(sendBuff), 0);
        cout << endl;
    }
 
    closesocket(hSocket);
    cout << "\nClose socket\n";
    
    WSACleanup();
 
    return 0;
}
 
DWORD WINAPI threadFunc(PVOID pParam){
    char tempBuffer[1024];
    SOCKET hClientSocket;
 
    sockaddr_in clientSockAddr;
    int         clientSockSize = sizeof(clientSockAddr);
 
    hClientSocket = accept(hSocket,
        reinterpret_cast<sockaddr*>(&clientSockAddr),
        &clientSockSize);
    cout << "Accept\n";
 
    while(true)
    {
        int retval;
        retval = recv(hClientSocket, tempBuffer, sizeof(tempBuffer) - 1, 0);
        if (retval == 0)
        { 
            break;
        }
        else if (retval == -1)
        {
            cout << "recv error: " << GetLastError() << endl;
            break;
        }
        else
        {
            tempBuffer[retval] = 0;
            cout << tempBuffer << "\n";
        }
    }
 
    closesocket(hClientSocket);
    cout << "Close client socket\n";
 
    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
#include "stdafx.h"
 
#include <iostream>
#include <winsock2.h>
#include <windows.h>
 
using namespace std;
 
SOCKET hSocket;
DWORD WINAPI threadFunc(PVOID pParam);
 
 
void main() {
    SOCKET hSocket;
    char tempBuffer[1024];
    sockaddr_in sockAddr = {0};
    WSAData wsaData;
    char message[1024];
 
    WSAStartup(MAKEWORD(2, 0), &wsaData);
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_port = htons(10001);
    sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    cout << "Socket created\n";
    connect(hSocket, reinterpret_cast<sockaddr*>(&sockAddr), sizeof(sockAddr));
    cout << "Connected\n";
 
    CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);
 
    while (TRUE) {
        cin >> message;
        if (message == "exit")
            break;
        send(hSocket, message, strlen(message), 0);
    }
 
    closesocket(hSocket);
    cout << "Socket closed\n";
    WSACleanup();
    system("PAUSE");
}
 
 
DWORD WINAPI threadFunc(PVOID pParam){
    char recvBuffer[1024];
    while(true)
    {
        int retval;
        retval = recv(hSocket, recvBuffer, sizeof(recvBuffer) - 1, 0);
        if (retval == 0)
        { 
            break;
        }
        else if (retval == -1)
        {
            cout << "recv error: " << GetLastError() << endl;
            break;
        }
        else
        {
            recvBuffer[retval] = 0;
            cout << recvBuffer << "\n";
        }
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2013, 00:36
Ответы с готовыми решениями:

Реализация чата Клиент - Клиент (сокеты)
Разобрался с созданием сокетов: инициализация, создание(ну или не разобрался =(( ). Не понял суть...

Как взаимодействуют клиент-сервер в готовой программе(сокеты)
Скачал курсовую &quot;Комплекс сетевой защиты&quot;. 2 программы клиент(raw_send) - сервер (raw_recv). в...

Низкоуровневые сокеты (ICMP протокол), Ошибка с типами, Клиент-Сервер
Создать для клиента генератор пакетов (для проведения атаки ICMP-Flood), а для сокета-сервера...

UDP клиент на сокетах - порты, с которых принимает recvfrom
Здравствуйте! Есть вопрос по UDP, постараюсь подробно сформулировать. Ситуация 1: На хосте А...

4
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
18.04.2013, 10:56 2
потому что 10038 это WSAENOTSOCK. у вас есть глобальное определение сокета. вы перекрываете его локальным определением. значение получает локальный. глобальный хранит мусор.
0
6 / 8 / 2
Регистрация: 20.12.2012
Сообщений: 729
18.04.2013, 14:52  [ТС] 3
Спасибо, не заметил. Ошибка исчезла, но клиент всё-равно ничего не принимает, только отправляет.
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
18.04.2013, 15:42 4
сервер должен слать на сокет полученный от accept
1
6 / 8 / 2
Регистрация: 20.12.2012
Сообщений: 729
18.04.2013, 15:52  [ТС] 5
Спасибо, работает.
0
18.04.2013, 15:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2013, 15:52
Помогаю со студенческими работами здесь

Сервер принимает пакеты если клиент указывает неверный порт получателя UDP.
Вот возникла проблема не могу понять почему сервер принимает пакеты если клиент указывает неверный...

Сокеты: не отправляет данные
Написал простую программку которая конектится к серверу и авторизируется методом Digest, но после...

Клиент-сервер. Клиент не принимает данные
Здравствуйте о светлейшие умы сего мира! Я работаю над одним проектом, а именно написание...

Сокеты - Переделать консольный клиент в клиент WinForms
Разбирал примеры клиентов и серверов на си шарп по сокетам. Вот попытался переделать консольный...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru