Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Запуск командной строки VS из конкретного каталога http://www.cyberforum.ru/cpp-beginners/thread1246995.html
Подскажите плиз, как запустить командную строку Visual Studio Command Promt (vsvars32.bat) из необходимого каталога, так как надоело постоянно использовать инструкцию cd.. для возврата из корневого каталога этого bat-файла. Я так понимаю, надо создать bat.файл и как-то указать путь, но все мои попытки завершились безуспешно.
C++ Json c++ send end write - существует ли готовая библиотека Здрасте, нужна такая штука которая бы умела посылать json обьекты методом post на кукую-нить страницу и получать оттуда json обьект в виде std::string т.е. у нас есть какой-нить string std::string pal = "{\"planet\":\"Tirella\"}" Мы его отправляем методом post на страницу localhost/core.php Там че-то обработать и вернуть ответ ввиде json//эт я и сам могу сделать std::string otvet =... http://www.cyberforum.ru/cpp-beginners/thread1246988.html
В дочерних классах компилятор сообщает об Undefined reference to pure virtual functions C++
Здравствуйте! Имеется базовый класс с чисто виртуальным деструктором (virtual ~Service() = 0). Однако в дочерних классах мне компилятор сообщает об undefined reference to ...::~Service(). Service (шаблон) целиком объявлен и реализован в hpp файле. Как это понимать?
Cannot convert from 'wchar_t' to 'const wchar_t *' C++
такой код, порылся в инете не помогло. ломать голову надоело может кто подскажет, буду благодарен. wchar_t * english = L"abvgdee ziyklmnoprstuf 'e " ; wchar_t TranslatedWord ; wcscat(TranslatedWord,english ) ;
C++ Нужен пример рекурсивной функции для понимания ее назначения и практической пользы http://www.cyberforum.ru/cpp-beginners/thread1246960.html
Не могу понять пользу рекурсии, может ли кто привести код в пример.
C++ Заменить все элементы, меньшие заданного числа, этим числом Использование функций-шаблонов: для работы с двумерными массивами арифметических типов данных разработать шаблоны ввода и вывода массива, а также шаблон для решения основной задачи:Заменить все элементы, меньшие заданного числа, этим числом. #include "iostream" #include "conio.h" using namespace std; template < typename Х> подробнее

Показать сообщение отдельно
mh-coder
24 / 23 / 3
Регистрация: 01.02.2014
Сообщений: 770

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

25.08.2014, 16:18. Просмотров 1787. Ответов 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 ) );
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru