32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878

Сокеты: после вызова send программа зависает на функции recv

25.08.2014, 16:18. Показов 8146. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Извеняюсь за такое назание темы, но уже перепробовал 100 вариантов и постоянно выкидывает данное предупреждение, уже и не знаю что блин написать))

Проблема в следующем:
Изучаю сокеты и столкнулся с небольшой проблемой, в данном коде я соеденяюсь с локкал хостом на порту 2222 дабы , и прописую данный порт в прокси в браузере, дабы отлавливать его заголовки, проблема в следующем,
1) после использования функции send - код зависает над функцией recv и не двигается с места, немогу понять почему
2) если убрать send то всё работает нормально, но recv постоянно возвращает заголовки отправлнные в первый раз не реагируя на те сайты которые открываются в браузере в дальнёйшем.


main.cpp

C++ (Qt)
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
// Mysock2.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "Server.h"
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
 
 
    char data[1000] = {NULL};
 
    Client c;
    Server b;
    b.LoadWinsoсk();
    b.CreateSocket();
 
    c.LoadWinsoсk();
    c.CreateSocket();
 
    b.Bind("127.0.0.1",2222,SOMAXCONN);
    b.Listen();
    b.Accept(c);
 
 
 
    while(true){
        c.RecvData(data,1000);  
 
    //  c.SendData(data,1000);
        cout<<c.GetError()<<"\n"<<data<<"\n";
 
 
    }
 
    return 0;
}

BaseNet.h

C++ (Qt)
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
#pragma once
#include <Windows.h>
#include <Winsock.h>
#pragma comment( lib, "Ws2_32.lib" )
 
 
class BaseNet
{
public:
    BaseNet(); 
    virtual ~BaseNet();
 
    bool LoadWinsoсk(void); // метод згрузки библиотеки Ws2_32.dll
    bool CreateSocket(void); // метод создания  сокета
    bool SendData(LPCSTR,const int &); // метод  передачи данных
    bool RecvData(LPSTR,const int &); // метод полученя данных
    bool CloseSocket(void); // метод закрытия сокета
    bool UnloadWinsock(void);// метод выгрузки Ws2_32.dll
    int GetError(void)const; // метод возврата кода ошибки
    int GetSendSize(void)const; //метод возврата количеств переданых байтов методом SendData
    int GetRecvSize(void)const;// метод возврата киличества принятых байтов методом vData
    
 
protected:
 
    WSADATA ws; //структура
    SOCKET Socket;
    struct sockaddr_in addr; //структура информации:ip, post, семейство протоколов
    int err; //код ошибки
    int size_send, size_recv;// количество переданных/принятых байт
 
private:
 
    bool Load_WSDATA;
};
BaseNet.cpp

C++ (Qt)
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
#include "stdafx.h"
#include "BaseNet.h"
 
 
BaseNet::BaseNet()
{
 
    memset(&this->ws, 0, sizeof(ws));
    this->Socket = NULL;
    memset(&this->addr, 0, sizeof(addr));
    this->err = 0;
    this->size_send = 0, this->size_recv = 0;
    this->Load_WSDATA = false;
}
 
 
BaseNet::~BaseNet()
{
 
    this->UnloadWinsock();
}
 
 
bool BaseNet::LoadWinsoсk(void){
 
    if (WSAStartup(0x0202, &this->ws))
    {
        this->err = WSAGetLastError();
        return false;
    }
    this->Load_WSDATA = true;
    return true;
}
 
 
bool BaseNet::CreateSocket(void){
 
    this->Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if (this->Socket == SOCKET_ERROR){
 
        this->err = WSAGetLastError();
        return false;
    }else{
        return true;
    }
 
}
 
 
bool BaseNet::SendData(LPCSTR _pbuf, const int & size_buf){
 
    this->size_send = send(this->Socket, _pbuf, size_buf, 0);
 
    if (this->size_send == SOCKET_ERROR){
 
        this->err = WSAGetLastError();
        return false;
    }
    else{
        return true;
    }
 
}
 
 
bool BaseNet::RecvData(LPSTR _pbuf, const int & size_buf){
    
 
    this->size_recv = recv(this->Socket, _pbuf, size_buf, 0);
 
    if (this->size_recv == SOCKET_ERROR){
 
        this->err = WSAGetLastError();
        return false;
    }
    else{
        return true;
    }
 
}
 
 
bool BaseNet::CloseSocket(void){
 
    if (closesocket(this->Socket) == SOCKET_ERROR){
        this->err = WSAGetLastError();
        return false;
    }
    else{
        return true;
    }
 
}
 
bool BaseNet::UnloadWinsock(void){
    if (this->Load_WSDATA){
    if (WSACleanup() == SOCKET_ERROR){
        this->err = WSAGetLastError();
        return false;
    }
    else{
        return true;
    }
}
    return false;
}
 
 
int BaseNet::GetError(void)const{
    return this->err;
}
 
 
int BaseNet::GetSendSize(void)const{
    return this->size_send;
 
}
int BaseNet::GetRecvSize(void)const{
    return this->size_recv;
}
Server.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
#include "BaseNet.h"
#include "Client.h"
class Server : public BaseNet
{
public:
    Server();
    virtual ~Server();
 
    bool Bind( LPCSTR       = "127.0.0.1",  // По умолчанию IP локальный, для удобства тестирования
        const UINT& = 33333,        // По умолчанию порт 33333
        const int&  = SOMAXCONN );  // По умолчанию SOMAXCONN клиентов будет ожидать сервер
 
 
    bool Listen(void); // метод прослушивания подключения клиентов
    bool Accept(Client &); // метод приёма поключения клиента
 
    // Остановка сервера
    bool StopServer( void );
 
 
};
Server.cpp

C++ (Qt)
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
#include "stdafx.h"
#include "Server.h"
 
 
Server::Server(void)
{
}
 
 
Server::~Server(void)
{
}
 
 
bool Server::Bind(LPCSTR _ip , const UINT &_port, const int &_count_client){
 
    BaseNet::addr.sin_family        = AF_INET;
    BaseNet::addr.sin_port          = htons( _port );
    BaseNet::addr.sin_addr.s_addr   = inet_addr( _ip );
 
 
    if( bind( BaseNet::Socket, ( const sockaddr* ) &this->addr, sizeof( BaseNet::addr ) ) == SOCKET_ERROR )
 
    {
        this->err = WSAGetLastError( );
        return false;
    }else{
        return true;
    }
 
 
}
 
bool Server::Listen(void){
 
    if ( listen( BaseNet::Socket, SOMAXCONN ) == SOCKET_ERROR )
    {
        BaseNet::err = ::WSAGetLastError( );
        return false;
    }else{
        return true;
    }
 
}
 
 
bool Server::Accept(Client &_client){
 
    SOCKET client_socket    = NULL;    
    sockaddr_in client_addr = { 0 };        
    int client_addr_size    = sizeof( client_addr );
 
    client_socket           = accept(   Socket, 
        ( sockaddr* )&client_addr, 
        &client_addr_size );
 
    if( client_socket == SOCKET_ERROR )
    {
        BaseNet::err = WSAGetLastError( );
        return false;
    }
 
    _client.SaveSocketAndSockaddr( client_socket, &client_addr );
    return true;
}
 
 
// Остановка сервера
bool Server::StopServer( void )
{
    // Закрытие сокета
    if( !BaseNet::CloseSocket( ) )
        return false;
 
    // Выгрузка Winsock
    if( !BaseNet::UnloadWinsock( ) )
        return false;
 
    return true;
}
Client.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
#include "BaseNet.h"
class Client : public BaseNet
{
public:
    Client(void);
    virtual ~Client(void);
 
 
    // Подключение к серверу
        bool Connect(   LPCSTR      = "127.0.0.1",  // IP/Name сервера
                        const UINT& = 33333 );      // Порт сервера
 
        // Отключение от сервера
        bool Disconnect( void );
 
        // Метод установки сохранение сокета и структуры сетевой информации
        void SaveSocketAndSockaddr( const SOCKET&,          // Сокет
                                    const sockaddr_in* );   // Структура sockaddr_in
 
};
Client.cpp

C++ (Qt)
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
#include "stdafx.h"
#include "Client.h"
 
 
Client::Client(void)
{
}
 
 
Client::~Client(void)
{
}
 
// Подключение к серверу
bool Client::Connect(   LPCSTR      _ip,        // IP/Name сервера
                        const UINT  &_port )    // Порт сервера
{
 
 
    // Заполнение структуры сетевой информации о сервере
    BaseNet::addr.sin_addr.s_addr = inet_addr( _ip );
    if( INADDR_NONE == BaseNet::addr.sin_addr.s_addr )
    {
        struct hostent *h = gethostbyname( _ip );
        if( !h )
        {
            BaseNet::err = WSAGetLastError( );
            return false;
        }
        BaseNet::addr.sin_addr = *(struct in_addr *) h->h_addr_list[0];
    }
    BaseNet::addr.sin_family    = AF_INET;
    BaseNet::addr.sin_port      = htons( _port );
 
    // Соединение с сервером
    if( connect( BaseNet::Socket, ( const struct sockaddr* )&this->addr, sizeof( BaseNet::addr ) ) == SOCKET_ERROR )
    {
        BaseNet::err = WSAGetLastError( );
        return false;
    }
    
    return true;
}
 
        
// Отключение от сервера
bool Client::Disconnect( void )
{
    // Закрытие сокета
    if( !BaseNet::CloseSocket( ) )
        return false;
 
    // Выгрузка Winsock
    if( !BaseNet::UnloadWinsock( ) )
        return false;
    
    return true;
}
 
// Метод установки сохранение сокета и структуры сетевой информации
void Client::SaveSocketAndSockaddr( const SOCKET        &_socket,   // Сокет
                                    const sockaddr_in   *_paddr )   // Структура sockaddr_in
{
    BaseNet::Socket = _socket;
    memcpy_s( &this->addr, sizeof( sockaddr_in ), _paddr, sizeof( sockaddr_in ) );
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2014, 16:18
Ответы с готовыми решениями:

Сокеты, send(), recv()
задача- пользователь ввел количество структур. заполнил их. Агенты-Клиенты работают просто так, в фоновом режиме почти. Сервер отправляет...

Recv зависает СОКЕТЫ с++
Всем привет, Я создал 2 приложения на Win32 API(клиент/сервер), клиент отправляет текст, а сервер его отображает в главном окне, вот в чём...

Функции puts(), send(), recv() и какая-то дичь
Всем здравствовать! Столкнулся с невероятно непонятной мне вещью и просто уже не могу... не могу разобраться. Написал я значится...

21
655 / 576 / 164
Регистрация: 13.12.2012
Сообщений: 2,126
30.08.2014, 00:30
Студворк — интернет-сервис помощи студентам
там про другие сокеты, это время вроде не выставляется(быть может что то путаю) советую почитать про мультиплексированный ввод вывод, ну или потоки....
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
30.08.2014, 15:08  [ТС]
Цитата Сообщение от aLarman Посмотреть сообщение
1ый вариант, знать это априори
2) в конце последовательности иметь уникальную посл.байт, что бы понять что все пришло Добавлено через 33 секунды
3) в передаваемой посл.байт отвести байт задающий длину последовательности
чесно говоря я ни слова не понял из написаного, а можно написать более понятны языком?

Добавлено через 2 часа 47 минут
Вобщем вот что в конце получилось, но серовно идеально неработает, код отрабатывает, но браузер всегда подвисает на том что должно было грузится последним и несмотря на то что код уже отработал - браузер черовно ждёт ответа, хелп, неужели тут никто сокеты не знает, я не верю

C++ (Qt)
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
// Mysock2.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "Header.h"
#include "Server.h"
 
DWORD WINAPI Thread( LPVOID );
 
struct info{
    char data[1024*64];
    Client C;
};
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
 
 
    Array ex;
    string url;
    char data[10240] = {NULL};
 
    Client c2;
    Client c;
    Server b;
    b.LoadWinsoсk();
    b.CreateSocket();
 
 
 
 
    c.CreateSocket();
 
 
 
 
    b.Bind("127.0.0.1",2222,SOMAXCONN);
    b.Listen();
 
    info send;
 
 
    while(true){
 
        b.Accept(c);
        
 
        if(c.GetRecvSize() != SOCKET_ERROR) {
            memset(data,0,sizeof(data));
            c.RecvData(data,sizeof(data));  
            strcpy(send.data,data);
            send.C = c;
            HANDLE Th = CreateThread(  NULL,NULL,Thread,(LPVOID)&send,NULL,NULL );   
            CloseHandle( Th );
 
        }
 
    }
 
    c.Disconnect();
    b.StopServer();
    return 0;
}
 
DWORD WINAPI Thread( LPVOID _param )
{
 
 
 
    info rec = *((info*)_param);
    Client c = rec.C;
    char data[1024*64] = {NULL};
    strcpy(data,rec.data);
 
    pFile a;
    Client c2;
    Array ex;
    string url;
    c2.LoadWinsoсk();
    c2.CreateSocket();
 
 
    if(strlen(data) == 0) {
        c2.Disconnect();
        return 0;
    }else{
        ex = explode("\r\n",data);
        url = str_replace("Host: ","",ex[1] );
        c2.Connect(url.c_str(),80);
 
 
        
        a.open("test.txt","w");
        a.write(data);
        a.write("\n\n");
 
    
        c2.SendData(data,strlen(data));
            
        //cout<<"\n--------------------------------------\n"<<data<<"\n--------------------------------------\n";
        while(true)
        {
            
 
 
            c2.RecvData(data,sizeof(data)-1);
            if(c2.GetRecvSize() == 0 || c2.GetRecvSize() == SOCKET_ERROR){
                c.SendData(data,c2.GetRecvSize());
                break;  
            }
 
    
            a.write(data);
            a.write("\n\n");
        
                
            c.SendData(data,c2.GetRecvSize());
        
 
            if(c.GetSendSize() == 0 || c.GetSendSize() == SOCKET_ERROR || data[c2.GetRecvSize()] == '\0'){
                break;  
            }
 
            memset(data,0,sizeof(data));
        }
 
 
 
    }
    a.close();
    c2.Disconnect();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.08.2014, 15:08

После вызова рекурсивной функции программа перестаёт работать
int mat,size,x=1,y, a=0, b=1; void mtt(int mat, int a, int b); int main(){ cin&gt;&gt;size; mtt(mat,a,b); cout&lt;&lt;&quot;JJ&quot;;//НЕ...

Сервер продолжает получать пустые сообщения после вызова метода Socket.Send
Есть сервер с сокетом, который выдает ответы на запросы. Связь с ним нормально работает через модем. Необходимо подключиться к нему с...

send/recv
Всем доброго времени суток. При написании простейшей клиент-серверной программы с возможностью передачи файлов, столкнулся с проблемой -...

send(.);recv(.);
Привет всем. Хроника событий: В сети имеются компьютеры a-сервер,b-клиент. 1. они соединяются через протокол TCP 2. ВНЕЗАПНО на...

SOCKET: send(), recv()
Начал разбираться с сокетами и в самом начале застрял на элементарном, с функциями send и recv, в програмке в которой сервер отправляет...


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

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

Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru