... и все казалось бы просто! Создаю соединение:
| Код | char* hname = "www.ya.ru"; hostent* hya; in_addr addrya;
hya = gethostbyname(hname); memcpy ((char*)&addrya, hya->h_addr, hya->h_length);
cout << "IP : "<< inet_ntoa(addrya) << endl;
SOCKET sCl = socket(AF_INET, SOCK_STREAM, 0);
if (sCl == INVALID_SOCKET) { cout << "Сокет-клинент не был создан!"<< endl; return 0; }
sockaddr_in hnm; hnm.sin_family = AF_INET; hnm.sin_addr.s_addr = inet_addr(inet_ntoa(addrya)); hnm.sin_port = htons(80); cout << "connect : "<< connect(sCl, (sockaddr*)&hnm, sizeof(hnm)) << endl;
|
Коннектит! Отправляю запрос:| Код | char* request = "HEAD http://www.ya.ru/ HTTP 1.1\r\n" "Host: ya.ru\r\n" "\r\n"; char response[1024]; strset(response, 0);
cout << "send : " << sendPk(sCl, request, (unsigned int)strlen(request)) <<endl; cout << "recv : " << recvPk(sCl, response, 1024) << endl;
|
с помощью фуекций sendPk и recvPk: | Код | int sendPk(SOCKET sock, const void* pData, unsigned int nLength) { if (send(sock, (char*)&nLength, sizeof(int), 0) != sizeof(int)) return -1;
if (send(sock, (char*)pData, nLength, 0) != nLength) return -1;
return nLength; }
int WaitResponse(SOCKET sock, double sec) { fd_set fds;
FD_ZERO(&fds); FD_SET(sock, &fds);
timeval tv;
tv.tv_sec = (unsigned long) sec; tv.tv_usec = (unsigned long)((sec - (unsigned long)sec) * 1000000);
return select((int)sock + 1, &fds, NULL, NULL, sec < 0 ? NULL : &tv) == 1; }
int recvPk(SOCKET sock, const void* pData, unsigned int nMaxLength) { unsigned int nLength, nTotalLength; int nRecieved;
if (!WaitResponse(sock, -1)) { cout << "NoResp"<< endl; return -1; }
if (recv(sock, (char*)&nLength, sizeof(int), 0) != sizeof(int)) { cout << "NoConn"<< endl; return -1; }
for (nTotalLength = nLength; nLength > 0&& nMaxLength > 0;) { nRecieved = recv(sock, (char*)pData, (nLength <= nMaxLength) ? nLength : nMaxLength, 0); if (nRecieved > 0) { pData = ((char*)pData) + nRecieved; nMaxLength -= nRecieved; nLength -= nRecieved; } }
if (nLength > 0) { char chSkipBuffer[1024]; while (nLength > 0) { nRecieved = recv(sock, (char*)chSkipBuffer, (nLength <= sizeof(chSkipBuffer)) ? nLength : sizeof(chSkipBuffer), 0); if(nRecieved > 0) nLength -= nRecieved; } }
return nTotalLength; }
|
. Запрос посылается успешно (судя по отладочной печати), а вот в ответ лишь урчание модема... и тишина, тишина, тишина. По началу дула, что там - на том конце - никого нет, проверил - есть!.. Ответа нет.
Тем, кто дочитал до конца эту бомбу - спасибо. Буду премного благодарен если подскажите "как правильно".
Вечно ваш. КОТ. |