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

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

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
()
Ответ на: комментарий от anonymous

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

man select

man poll

anonymous
()
Ответ на: комментарий от anonymous

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

cvv ★★★★★
()

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

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

k0l0b0k ★★
()

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

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

k0l0b0k ★★
()

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

//перед 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
()

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

//перед 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
()
Ответ на: комментарий от anonymous

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
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

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