Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > как получить данные через сокет в C++?


Автор: americanets 26.11.2008, 11:01
как получать данные через сокеты в  C++ погуглив не смог разобраться


Код

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <iostream>


int main () {
    int m_sock;
    sockaddr_in m_addr;
    m_addr.sin_family = AF_INET;
    m_addr.sin_port = htons ( 80 );
    m_sock = socket ( AF_INET, SOCK_STREAM, 0 );
    int status = inet_pton ( AF_INET, "google.ru", &m_addr.sin_addr );
    status = ::connect ( m_sock, ( sockaddr * ) &m_addr, sizeof ( m_addr ) );
    if ( status != 0 ) {
        std::cout << "Error" << std::endl;
    }
    return 0;
}



как мне получить контент страницы и заголовки ответа ? 

Автор: MAKCim 26.11.2008, 12:19
1. читай внимательно man по inet_pton
эта функция принимает IPv4/6 адреса в строковом представлении, а не имя хоста
для начала нужно воспользовать резолвером типа getaddrinfo

2.
Цитата(americanets @  26.11.2008,  11:01 Найти цитируемый пост)
как мне получить контент страницы и заголовки ответа ?  

через send/write отправить GET запрос хосту, потом через recv/read прочитать ответ

Автор: americanets 26.11.2008, 12:37
MAKCim, а про 2-е можно по подробнее  smile 

Автор: jonie 27.11.2008, 01:24
про 2 : http://www.w3.org/Protocols/rfc2616/rfc2616.html

Автор: americanets 27.11.2008, 10:12
jonie, почитал



MAKCim, что -то не получается, виснет и все 


Код

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <iostream>
#include <string.h>


int main () {
    int m_sock;
    char buf [ 501 ];
    const std::string s = "ds";
    sockaddr_in m_addr;
    m_addr.sin_family = AF_INET;
    m_addr.sin_port = htons ( 80 );
    m_sock = socket ( AF_INET, SOCK_STREAM, 0 );
    int status = inet_pton ( AF_INET, "127.0.0.1", &m_addr.sin_addr );
    status = ::connect ( m_sock, ( sockaddr * ) &m_addr, sizeof ( m_addr ) );
    if ( status != 0 ) {
        std::cout << "Error" << std::endl;
    }
    memset ( buf, 0, 501);
    status = ::send ( m_sock, s.c_str(), s.size(), MSG_NOSIGNAL );
    status = ::recv ( m_sock, buf, 501, 0 );
    std::cout << buf << std::endl;
    return 0;
}

Автор: MAKCim 27.11.2008, 22:19
americanets, 
рискну предположить, что на локальном хосте не запущен HTTP сервер  smile 

Автор: americanets 28.11.2008, 09:44
MAKCim, не , все работает (127.0.0.1) открывается


Код

ping -c1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.041 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.041/0.041/0.041/0.000 ms


Автор: MAKCim 28.11.2008, 14:03
americanets, 
все правильно, loopback интерфейс и будет пинговаться
но это совсем не значит, что есть сервер, слушающий 80-ый порт с него  smile 
короче, советую сначала ознакомиться с литературой

Автор: americanets 28.11.2008, 14:09
понятно пошел читать , сервер есть , апач , он какраз на 80 висит

Автор: MAKCim 28.11.2008, 15:16
Цитата(americanets @  28.11.2008,  14:09 Найти цитируемый пост)
он какраз на 80 висит

Он точно забинден на локальный адрес 127.0.0.1?

Автор: americanets 28.11.2008, 15:30
да , там phpadmin висит через браузер 127.0.0.1:80 открывается и показывает 

Автор: Олег2005 30.11.2008, 14:54
Цитата(americanets @  27.11.2008,  09:12 Найти цитируемый пост)
что -то не получается, виснет и все 

А что виснет то? Где именно?
Почему после вызова сетевых функций нет анализа кода возврата? - обязательного для сетевых программ - причин повисания може быть несколько - как понять то?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)