Проблемма с сокетами

Тема в разделе "WASM.NETWORKS", создана пользователем Doman, 24 фев 2006.

  1. Doman

    Doman New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2005
    Сообщения:
    29
    Адрес:
    Russia
    Недавно решил попробовать поработать с сокетами взял описания с этого сайта переложил это на Builder6 получился следующий код, который подключается к серверу этого сайта и запрашивает одну страницу. Так вот conect проходит вроде бы нормально но вот на recv зависает и никакого ответа. Может кто обьяснит в чем дело (я не проффесиональный програмист, скорее любитель)
    Код (Text):
    1.  
    2. //-------------------------------------------------------------------- -------
    3.  
    4. #include <vcl.h>
    5. #pragma hdrstop
    6. #include "Unit1.h"
    7. //-------------------------------------------------------------------- -------
    8. #pragma package(smart_init)
    9. #pragma resource "*.dfm"
    10.  
    11. #define SRV_PORT 80
    12. #define CLNT_PORT 81
    13. #define SRV_HOST "www.wasm.ru"
    14. #define BUF_SIZE 1024
    15.  
    16. TForm1 *Form1;
    17. hostent         *hp;
    18. sockaddr_in     clnt_sin, srv_sin;
    19. int             s;
    20. int             len;
    21. int             a;
    22. char            buffer[BUF_SIZE];
    23. char            name[BUF_SIZE];
    24. //-------------------------------------------------------------------- -------
    25. __fastcall TForm1::TForm1(TComponent* Owner)
    26.         : TForm(Owner)
    27. {
    28. WSADATA  WSAData;
    29. if (0==WSAStartup( 0x102,&WSAData)){
    30. }else {
    31.         Application->MessageBoxA("NO","ERROR",MB_OK);
    32. }
    33. }
    34. //-------------------------------------------------------------------- -------
    35. void __fastcall TForm1::Button1Click(TObject *Sender)
    36. {
    37. s = socket (AF_INET, SOCK_STREAM, 0);
    38. memset((char *)&clnt_sin, '\0',sizeof(clnt_sin));
    39. clnt_sin.sin_family = AF_INET;
    40. clnt_sin.sin_addr.s_addr = INADDR_ANY;
    41. clnt_sin.sin_port = htons(CLNT_PORT);
    42. a = bind(s,(struct sockaddr *)&clnt_sin,sizeof(clnt_sin));
    43. memset((char *)&srv_sin, '\0',sizeof(srv_sin));
    44. hp = gethostbyname(SRV_HOST);
    45. srv_sin.sin_family = AF_INET;
    46. memcpy((char*)&srv_sin.sin_addr,hp->h_addr,hp->h_length);
    47. srv_sin.sin_port = htons(SRV_PORT);
    48. a = connect (s, (sockaddr *)&srv_sin, sizeof(*((sockaddr *)&srv_sin)));
    49. String Text = GET /article.php?article=1016002 HTTP/1.1<\n>
    50.  User-Agent: ManualSender/1.0 :)<\n> Host: [url=http://www.wasm.ru<\n>]www.wasm.ru<\n>[/url] <\n>" ;
    51. send(s,Text.c_str(), sizeof(Text.c_str()),0);
    52. len = recv(s, buffer,BUF_SIZE,0);
    53. if (AnsiString(buffer)!=""){
    54.         Form1->Memo1->Lines->Add(AnsiString(buffer));
    55. }
    56. closesocket(s);
    57. }
    58. //--------------------------------------------------------
    59.  
     
  2. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    В твоем коде можно голову сломать :)

    А разве можно и биндить и делать конект на одном сокете ?





    s = socket (AF_INET, SOCK_STREAM, 0);

    a = bind(s,(struct sockaddr *)&clnt_sin,sizeof(clnt_sin));

    a = connect (s, (sockaddr *)&srv_sin, sizeof(*((sockaddr *)&srv_sin)));
     
  3. Doman

    Doman New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2005
    Сообщения:
    29
    Адрес:
    Russia
    Сам задовался этим вопросом, просто в одном примере и конектят и биндят, а в другом просто конектят (где правильно не знаю), но я пробовал и так и так все равно не помогает. А то что текст неразборчивый извините, бралось с разных описаний, и я даже сам поначалу путался
     
  4. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    WSADATA WSAData;

    SOCKET hClientSocket;

    SOCKADDR_IN local_sin;



    if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0)

    {

    printf ("WSAStartup failed. Error: %d\n", WSAGetLastError ());

    return 1;

    }



    if ((hClientSocket = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)

    {

    printf ("socket failed. Error: %d\n", WSAGetLastError ());

    return 1;

    }



    local_sin.sin_family = AF_INET;

    local_sin.sin_port = htons (80);

    local_sin.sin_addr.s_addr = inet_addr("127.0.0.1");



    connect(hClientSocket,(struct sockaddr *)&local_sin,sizeof(local_sin));



    Вот рабочий пример.



    [add]



    Почитай мсдн на счет inet_addr,

    Parameters



    [in] Null-terminated character string representing a number expressed in the Internet standard ".'' (dotted) notation.
     
  5. Doman

    Doman New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2005
    Сообщения:
    29
    Адрес:
    Russia
    судя по всему у тебя соединение по локальной сети, а уменя выход в интернет и на вызове recv дело приостанавливается хотя по трафику вижу, что что-то подкачивается - но уж больно много и долго для обычной страницы.
     
  6. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    У меня выход в нет через сервер. Но это ни при чем, так как я бегаю через NАТ.



    ЗЫ. У тебя реквест не правильный, вот что сервер возвращает:



    HTTP/1.1 400 Bad Request

    Date: Fri, 24 Feb 2006 19:10:57 GMT

    Server: Apache/1.3.33 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7d

    Connection: close

    Transfer-Encoding: chunked

    Content-Type: text/html; charset=iso-8859-1
     
  7. Doman

    Doman New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2005
    Сообщения:
    29
    Адрес:
    Russia
    извини, но поясни пожалуйста что такое реквест (я же говорил что я любитель и тем более с сокетами начал разбиратся недавно)
     
  8. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Request - Запрос "GET bla bla bla ...", а вообще советую

    почитать :)
     
  9. Doman

    Doman New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2005
    Сообщения:
    29
    Адрес:
    Russia
    Ну а этот запрос правильный:

    "GET /forum/index.php?action=vthread&forum=12&topic=13545&page=-1 HTTP/1.1\r\nUser-Agent: ManualSender/1.0\r\nHost: www.wasm.ru\r\n\r\n"

    Он на эту страницу, результата все равно нет - ответа сервер не присылает, а по поводу ссылки почитаю спасибо.
     
  10. Doman

    Doman New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2005
    Сообщения:
    29
    Адрес:
    Russia
    Кстати ещё вопрос как мне проверить HTTP запрос на правильность ?
     
  11. Doman

    Doman New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2005
    Сообщения:
    29
    Адрес:
    Russia
    Вот я переработал функцию нажатия кнопки, и все равно ничего хорошего, конектица, но данных ни каких не получает в ответ на запрос.
    Код (Text):
    1.  
    2. void __fastcall TForm1::Button1Click(TObject *Sender)
    3. {
    4. s = socket (AF_INET, SOCK_STREAM, 0);
    5. memset((char *)&srv_sin, '\0',sizeof(srv_sin));
    6. hp = gethostbyname(SRV_HOST);
    7. srv_sin.sin_family = AF_INET;
    8. memcpy((char*)&srv_sin.sin_addr,hp->h_addr,hp->h_length);
    9. srv_sin.sin_port = htons(SRV_PORT);
    10. a = connect (s, (sockaddr *)&srv_sin, sizeof(*((sockaddr *)&srv_sin)));
    11. char Text[] = "GET /forum/index.php?action=vthread&forum=12&topic=13545&page=-1 HTTP/1.0\r\nHost: [url=http://www.wasm.ru\r\nUser-Agent:]www.wasm.ru\r\nUser-Agent:[/url] ManualSender/1.0\r\n\r\n";
    12. len = send(s,Text, sizeof(Text),0);
    13. len = recv(s, buffer,BUF_SIZE,0);
    14. if (AnsiString(buffer)!=""){
    15.         Form1->Memo1->Lines->Text = AnsiString(buffer);
    16. }
    17. closesocket(s);
    18. }
    19.