Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.42.196] |
|
Сообщ.
#1
,
|
|
|
Доброе время суток.
На Си ++ программирую неделю,возникла необходимость отправить GET запрос используя winsock. Набросал простенький код.Запустил сниффер HTTP запросов,запустил свою программу,программа отработала без ошибок,Но и в сниффере запрос не отобразился.На компьютере нет антивирусов фаэрволов, бредмауэр отключен. Помогите понять что я делаю не так. #include <tchar.h> #include <winsock.h> #include <windows.h> #pragma comment(lib, "WSOCK32.lib") //преобразование имени в IP int get_addr(char *host_name) { int res = -1; HOSTENT *phe = gethostbyname(host_name); if (phe) for (int i = 0; i < 4; i++) ((BYTE *)&res)[i] = phe->h_addr_list[0][i]; return res; } //Отправка запроса int TestGet() { WSADATA wsa_data; if (WSAStartup(0x101, &wsa_data)) { MessageBox(0,L"Error WSAStartup",0,0); } if (wsa_data.wVersion != 0x101) { MessageBox(0,L"Error WSAStartup Version",0,0); } SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET) { MessageBox(0,L"Error Create Sock",0,0); } char host_name[256] = "vk.ru"; int host_port = 80; char doc[256] = "/?act=login&email=xxx&pass=xxx"; SOCKADDR_IN sa; sa.sin_family = AF_INET; sa.sin_port = htons(host_port); sa.sin_addr.S_un.S_addr = get_addr(host_name); if (connect(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR) { MessageBox(0,L"Err Connect",0,0); } char message[256]= "GET http://%s%s HTTP/1.1\r\n" "Host: %s\r\n" "Connection: Keep-Alive\r\n" "\r\n\r\n"; send(s, message,sizeof(message),0) ; closesocket(s); WSACleanup(); return 0; } |
Сообщ.
#2
,
|
|
|
Во-первых надо проверять результат функции send - показывает сколько реально отправлено, во-вторых зачем ты отправляешь sizeof(message)? Это 256 байт, хотя твое сообщение меньше.
|
Сообщ.
#3
,
|
|
|
Исправил
Заменил sizeof(message) на strlen(message) включил проверку. if(send(s, message,strlen(message),0)==0) MessageBox(0,L"Error Send",0,0); Все равно ничего не отправляет. Достаточно подключить <winsock.h> и #pragma comment(lib, "WSOCK32.lib") или нужно еще что то? |
Сообщ.
#4
,
|
|
|
Цитата Angel @ Исправил Заменил sizeof(message) на strlen(message) включил проверку. if(send(s, message,strlen(message),0)==0) MessageBox(0,L"Error Send",0,0); Все равно ничего не отправляет. Достаточно подключить <winsock.h> и #pragma comment(lib, "WSOCK32.lib") или нужно еще что то? Цитата if(send(s, message,strlen(message),0)==0) MessageBox(0,L"Error Send",0,0); Результатом функции send является кол-во отправленных байт, просто выведи что он возвращает и сравни с кол-вом, которое хочешь отправить. |
Сообщ.
#5
,
|
|
|
Длину возвращает правильную!Запрос не отправляется.Я уже все что можно пересмотрел,перепробовал.Создал точно такую же программу на делфи.запрос отправляется.Сделал на С++ используя WinInet..тоже запрос не отправляется
Видимо у меня что то с Visual Studio..такое может быть? Добавлено Создал новое консольное приложение,скопировал туда свой код и все заработало. Создал новое приложение Win32,пустой проэкт.скопировал свой код не работает))))) В чем магия????????Почему работает только в консольном приложении??? |
Сообщ.
#6
,
|
|
|
Цитата Angel @ Длину возвращает правильную!Запрос не отправляется Возможно, ты закрываешь сокет раньше, чем физически отправляются данные: // ... send(s, message,sizeof(message),0) ; Sleep(10000);// Попробуем подождать 10 секунд closesocket(s); WSACleanup(); // ... |
Сообщ.
#7
,
|
|
|
Цитата ЫукпШ @ Цитата Angel @ Длину возвращает правильную!Запрос не отправляется Возможно, ты закрываешь сокет раньше, чем физически отправляются данные: // ... send(s, message,sizeof(message),0) ; Sleep(10000);// Попробуем подождать 10 секунд closesocket(s); WSACleanup(); // ... не помогает,да и мой код в консольном приложении работает.Не работает в Win32 |
Сообщ.
#8
,
|
|
|
А при создании win32 приложения ты в визарде какие галочки ставишь? Если ничего не меняешь, то создаеться оконное приложение, куда ты код свой вставляешь?
|
Сообщ.
#9
,
|
|
|
я ставлю галочку пустой проект,затем создаю файл .cpp,добавляю его в дерево проектов.
|
Сообщ.
#10
,
|
|
|
Angel
А отладчиком пробовал пройтись? Такое ощущение, что TestGet() у тебя из main() вообще не вызывается. Добавь в TestGet() еще один MessageBox, в самое начало, чтобы убедиться. |
Сообщ.
#11
,
|
|
|
Цитата Pacific @ Angel А отладчиком пробовал пройтись? Такое ощущение, что TestGet() у тебя из main() вообще не вызывается. Добавь в TestGet() еще один MessageBox, в самое начало, чтобы убедиться. Пробовал.Вызывается. Более того я решил проблему. УДАЛИЛ ПРОЕКТ,СОЗДАЛ ЗАНОВО.все заработало...интересно все же что за косяк был.. |
Сообщ.
#12
,
|
|
|
Нда, интерфейс Винсока тут не виноват...
|