LINUX.ORG.RU

сокет. получить данные


0

0

пардон, вновь к сокетам) хотелось бы подцепиться с хосту, послать данные и получить ответ. я начал так-

int sock_flags = 0; int m_socket; struct sockaddr_in address;

if((m_socket=socket(AF_INET, SOCK_STREAM, 0)) == -1) return(1); if((sock_flags = fcntl(m_socket, F_GETFL, 0)) == -1) return(1); if(fcntl(m_socket, F_SETFL, sock_flags | O_NONBLOCK) == -1) return(1);

memset(&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_port = htons(port); address.sin_addr(ip);

if (::connect(m_socket, (struct sockaddr*)&address, sizeof(address)) and errno != EINPROGRESS) return(1);

fd_set rfds, wfds; struct timeval tv; int max_fd = -1; int rc; tv.tv_sec=1; tv.tv_usec=100000; FD_ZERO(&rfds); FD_ZERO(&wfds); FD_SET(m_socket, &wfds); FD_SET(m_socket, &rfds);

if(m_socket > max_fd) max_fd = m_socket;

errno = 0; if((rc = select(max_fd + 1, &rfds, &wfds, NULL, &tv)) < 0) if (errno != EINPROGRESS) return(1); else if(!rc) return(1);

//коннектед

m_proxy_request.query= "GET http://www.google.com HTTP/1.0\n"; m_proxy_request.sented = 0; ssize_t sented;

if((sented = send(m_socket, m_proxy_request.query + m_proxy_request.sented, strlen(m_proxy_request.query) - m_proxy_request.sented, MSG_DONTWAIT)) <= 0) return(1);

//тут проверки и якобы отправили данные

ssize_t received;

memset(&m_proxy_answer, 0, sizeof m_proxy_answer);

if((received = recv(m_socket, m_proxy_answer.buf + m_proxy_answer.received, PROXY_RECV_BUFSIZE - m_proxy_answer.received, MSG_DONTWAIT)) <= 0) { fprintf(stderr, "%d recv: %s\n", __LINE__, strerror(errno)); return(1); } //а вот тут вылетает с еррором //183 recv: Resource temporarily unavailable

т.е сервер ничего не посылает или надо подождать или еще чего. сокет неблок. может из-за этого? неподскажите как победить и данные таки получить?

anonymous

Re: сокет. получить данные

блин эти переходы строк.. пардон) надеюсь поправится

int sock_flags = 0;
int m_socket;
struct sockaddr_in address;

if((m_socket=socket(AF_INET, SOCK_STREAM, 0)) == -1) return(1);
if((sock_flags = fcntl(m_socket, F_GETFL, 0)) == -1) return(1);
if(fcntl(m_socket, F_SETFL, sock_flags | O_NONBLOCK) == -1) return(1);

memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(port);
address.sin_addr(ip);

if (::connect(m_socket, (struct sockaddr*)&address, sizeof(address)) and errno != EINPROGRESS) return(1);

fd_set rfds, wfds;
struct timeval tv;
int max_fd = -1;
int rc;
tv.tv_sec=1;
tv.tv_usec=100000;

FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_SET(m_socket, &wfds);
FD_SET(m_socket, &rfds);

if(m_socket > max_fd) max_fd = m_socket;

errno = 0;
if((rc = select(max_fd + 1, &rfds, &wfds, NULL, &tv)) < 0)
{ if (errno != EINPROGRESS)  return(1);}
else if(!rc)  return(1);

//коннектед

m_proxy_request.query= "GET http://www.google.com HTTP/1.0\n";
m_proxy_request.sented = 0;

ssize_t sented;

if((sented = send(m_socket, m_proxy_request.query + m_proxy_request.sented, strlen(m_proxy_request.query) - m_proxy_request.sented, MSG_DONTWAIT)) <= 0) return(1);

//тут проверки и якобы отправили данные

ssize_t received;
memset(&m_proxy_answer, 0, sizeof m_proxy_answer);

if((received = recv(m_socket, m_proxy_answer.buf + m_proxy_answer.received, PROXY_RECV_BUFSIZE - m_proxy_answer.received, MSG_DONTWAIT)) <= 0)
{
 fprintf(stderr, "%d recv: %s\n", __LINE__, strerror(errno));
 return(1);
}

//а вот тут вылетает с еррором
//183 recv: Resource temporarily unavailable

anonymous ()
Ответ на: Re: сокет. получить данные от anonymous

Re: сокет. получить данные

Надо ждать события когда из сокета можно будет прочитать данные.

man select

man poll

anonymous ()
Ответ на: Re: сокет. получить данные от anonymous

Re: сокет. получить данные

ещё можеш не отключать блокирующий режим так как у тебя только 1 сокет.

cvv ★★★★★ ()

Re: сокет. получить данные

Это форматирование такое, или вы всегда так пишете?

Вообще-то неблокирующий сокет надо поллить на предмет данных (man poll, man select).

k0l0b0k ★★ ()

Re: сокет. получить данные

Это форматирование такое, или вы всегда так пишете?

Вообще-то неблокирующий сокет надо поллить на предмет данных (man poll, man select).

k0l0b0k ★★ ()

Re: сокет. получить данные

пишу так) пробовал палить селект, вот, не идет) отваливается с таймаутом. а по идее должно.. по запросу видно что я прокси проверяю. прокся рабочая, я по ней через браузер топчусь нормально, а вот толи на этот запрос, толи еще из-за чего - молчит.. ну или не молчит, а просто не там слушаю.. прям незнаю даже (

//перед recv подождать FD_ZERO(&rfds); FD_SET(m_socket, &rfds); tv.tv_sec = 5; tv.tv_usec = 0;

if((rc = select(m_socket + 1, &rfds, NULL, NULL, &tv)) < 0) { if (errno != EINPROGRESS) { fprintf(stderr, "%d Unable to select: %s\n", __LINE__, strerror(errno)); return(1); } } else if(!rc) { fprintf(stderr, "%d time out connect: %s\n", __LINE__, strerror(errno)); return(1); } else printf("Data is available now.\n"); // тут бы был recv, но похоже что нечего рецв

anonymous ()

Re: сокет. получить данные

да блин) пардон)

//перед recv подождать FD_ZERO(&rfds); FD_SET(m_socket, &rfds); tv.tv_sec = 5; tv.tv_usec = 0;

if((rc = select(m_socket + 1, &rfds, NULL, NULL, &tv)) < 0) { if (errno != EINPROGRESS) { fprintf(stderr, "%d Unable to select: %s\n", __LINE__, strerror(errno)); return(1); } } else if(!rc) { fprintf(stderr, "%d time out connect: %s\n", __LINE__, strerror(errno)); return(1); } else printf("Data is available now.\n"); // тут бы был recv, но похоже что нечего рецв

anonymous ()
Ответ на: Re: сокет. получить данные от anonymous

Re: сокет. получить данные

arrrrhhh!!

//перед recv подождать
FD_ZERO(&rfds);
FD_SET(m_socket, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;

if((rc = select(m_socket + 1, &rfds, NULL, NULL, &tv)) < 0)
{
  if (errno != EINPROGRESS)
  {
    fprintf(stderr, "%d Unable to select: %s\n", __LINE__, strerror(errno));
    return(1);
  }
}
else if(!rc)
{
  fprintf(stderr, "%d time out connect: %s\n", __LINE__, strerror(errno));
  return(1);
}
else printf("Data is available now.\n");
// тут бы был recv, но похоже что нечего рецв

anonymous ()
Ответ на: Re: сокет. получить данные от anonymous

Re: сокет. получить данные

ладно все понятно) разобрался) получается считывать ошибку ответа сервера, на другие запросы просто сервер молчит. ушел читать rfc...

anonymous ()
Ответ на: Re: сокет. получить данные от anonymous

Re: сокет. получить данные

ан нет еще не все^^
вопщем как описано было выше чегото посылается проксе. на некотором хостинге лежит некоторый пхп скриптец который создает некое файло, предельно просто. при посылке проксе запроса на гет этого скрипта по указанному адресу - файло не создается (однако прокся сообщает что мол все впорядке - ответ 200). если же просто через браузер топнуть - создается. в чем причина? снифером тыркался вроде также..

"GET someserver.domen/script.php HTTP/1.0\n";

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.