Недавно решил попробовать поработать с сокетами взял описания с этого сайта переложил это на Builder6 получился следующий код, который подключается к серверу этого сайта и запрашивает одну страницу. Так вот conect проходит вроде бы нормально но вот на recv зависает и никакого ответа. Может кто обьяснит в чем дело (я не проффесиональный програмист, скорее любитель) Код (Text): //-------------------------------------------------------------------- ------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //-------------------------------------------------------------------- ------- #pragma package(smart_init) #pragma resource "*.dfm" #define SRV_PORT 80 #define CLNT_PORT 81 #define SRV_HOST "www.wasm.ru" #define BUF_SIZE 1024 TForm1 *Form1; hostent *hp; sockaddr_in clnt_sin, srv_sin; int s; int len; int a; char buffer[BUF_SIZE]; char name[BUF_SIZE]; //-------------------------------------------------------------------- ------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { WSADATA WSAData; if (0==WSAStartup( 0x102,&WSAData)){ }else { Application->MessageBoxA("NO","ERROR",MB_OK); } } //-------------------------------------------------------------------- ------- void __fastcall TForm1::Button1Click(TObject *Sender) { s = socket (AF_INET, SOCK_STREAM, 0); memset((char *)&clnt_sin, '\0',sizeof(clnt_sin)); clnt_sin.sin_family = AF_INET; clnt_sin.sin_addr.s_addr = INADDR_ANY; clnt_sin.sin_port = htons(CLNT_PORT); a = bind(s,(struct sockaddr *)&clnt_sin,sizeof(clnt_sin)); memset((char *)&srv_sin, '\0',sizeof(srv_sin)); hp = gethostbyname(SRV_HOST); srv_sin.sin_family = AF_INET; memcpy((char*)&srv_sin.sin_addr,hp->h_addr,hp->h_length); srv_sin.sin_port = htons(SRV_PORT); a = connect (s, (sockaddr *)&srv_sin, sizeof(*((sockaddr *)&srv_sin))); String Text = GET /article.php?article=1016002 HTTP/1.1<\n> User-Agent: ManualSender/1.0 :)<\n> Host: [url=http://www.wasm.ru<\n>]www.wasm.ru<\n>[/url] <\n>" ; send(s,Text.c_str(), sizeof(Text.c_str()),0); len = recv(s, buffer,BUF_SIZE,0); if (AnsiString(buffer)!=""){ Form1->Memo1->Lines->Add(AnsiString(buffer)); } closesocket(s); } //--------------------------------------------------------
В твоем коде можно голову сломать А разве можно и биндить и делать конект на одном сокете ? 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)));
Сам задовался этим вопросом, просто в одном примере и конектят и биндят, а в другом просто конектят (где правильно не знаю), но я пробовал и так и так все равно не помогает. А то что текст неразборчивый извините, бралось с разных описаний, и я даже сам поначалу путался
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.
судя по всему у тебя соединение по локальной сети, а уменя выход в интернет и на вызове recv дело приостанавливается хотя по трафику вижу, что что-то подкачивается - но уж больно много и долго для обычной страницы.
У меня выход в нет через сервер. Но это ни при чем, так как я бегаю через 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
извини, но поясни пожалуйста что такое реквест (я же говорил что я любитель и тем более с сокетами начал разбиратся недавно)
Ну а этот запрос правильный: "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" Он на эту страницу, результата все равно нет - ответа сервер не присылает, а по поводу ссылки почитаю спасибо.
Вот я переработал функцию нажатия кнопки, и все равно ничего хорошего, конектица, но данных ни каких не получает в ответ на запрос. Код (Text): void __fastcall TForm1::Button1Click(TObject *Sender) { s = socket (AF_INET, SOCK_STREAM, 0); memset((char *)&srv_sin, '\0',sizeof(srv_sin)); hp = gethostbyname(SRV_HOST); srv_sin.sin_family = AF_INET; memcpy((char*)&srv_sin.sin_addr,hp->h_addr,hp->h_length); srv_sin.sin_port = htons(SRV_PORT); a = connect (s, (sockaddr *)&srv_sin, sizeof(*((sockaddr *)&srv_sin))); 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"; len = send(s,Text, sizeof(Text),0); len = recv(s, buffer,BUF_SIZE,0); if (AnsiString(buffer)!=""){ Form1->Memo1->Lines->Text = AnsiString(buffer); } closesocket(s); }