Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > C/C++: Сетевое программирование > Вопрос по ioctlsocket, FIONREAD.... |
Автор: MIA2000 19.08.04, 10:07 |
Добрый день sorry за беспокойство, но я столкнулся с проблеммой надеюсь на Вашу помощь. Проблема в следующем: Вызываю ioctlsocket(hSocket, FIONREAD, &ulParam ); Ошибки не возвращает. Все проходит нормально я получаю сообщение. Hо в ulParam всегда возвращает ноль, хотя я уже послал килобайт 10 в этот сокет. Если не сложно покажите рабочий пример, с выводом количества инфы в стеке сокета. Спасибо. |
Автор: Gunnar 19.08.04, 11:06 |
У тебя наверное сокет асинхронный |
Автор: MIA2000 19.08.04, 11:13 |
А причем тут асинхронность? Он не переведен в не блокируемый режим. |
Автор: Gunnar 19.08.04, 11:48 |
Цитата MIA2000, 19.08.04, 14:13 А причем тут асинхронность? При том что эта команда только для синхронных сокетов Цитата MIA2000, 19.08.04, 14:13 Он не переведен в не блокируемый режим. Правильно - он в нем по умолчанию |
Автор: MIA2000 19.08.04, 11:55 |
Так, что же мне сделать? Я вроде все правильно делаю.... Если не сложно то подскажите где ошибка... Вот кусок кода: ------------------------------------------------------------------------ <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> WSADATA wsaData; WORD wVersionRequested; wVersionRequested = MAKEWORD(2,0); WSAStartup(wVersionRequested, &wsaData); SOCKET sock,sock_new; sock = socket(AF_INET,SOCK_STREAM,0); if (sock!=INVALID_SOCKET) { SOCKADDR_IN socketaddr, from_sin; socketaddr.sin_family = AF_INET; socketaddr.sin_addr.s_addr = INADDR_ANY; socketaddr.sin_port = PORT_ADDR; int iAddsize=sizeof(socketaddr); bind(sock,(struct sockaddr*)&socketaddr,iAddsize); listen(sock,5); int iAddsize2=sizeof(from_sin); while(1){ sock_new=accept(sock,(struct sockaddr*)&from_sin,&iAddsize2); DWORD mia; ioctlsocket( sock_new, FIONREAD, &mia) ; printf("%d",mia); dwLenIn = recv( sock_new, bu , dwLenIn, 0); printf("%s",bu); } |
Автор: Братец Лис 19.08.04, 14:03 |
Цитата Gunnar, 19.08.04, 14:48 При том что эта команда только для синхронных сокетов Цитата MSDN The ioctlsocket function can be used on any socket in any state. It is used to set or retrieve operating parameters associated with the socket, independent of the protocol and communications subsystem Добавлено в : Цитата Gunnar, 19.08.04, 14:48 Правильно - он в нем по умолчанию Цитата MSDN When a socket is created, it operates in blocking mode by default (nonblocking mode is disabled). Тут скорее всего дело не в этом, может там действительно 0? Может данных нет? Проверял? |
Автор: Gunnar 19.08.04, 14:11 |
Цитата Братец Лис, 19.08.04, 17:03 Цитата MSDN The ioctlsocket function can be used on any socket in any state. It is used to set or retrieve operating parameters associated with the socket, independent of the protocol and communications subsystem Цитата Братец Лис, 19.08.04, 17:03 Цитата MSDN When a socket is created, it operates in blocking mode by default (nonblocking mode is disabled). Угу, только у меня почему то все время наоборот получается... В чем дело? Может я тупой? |
Автор: Братец Лис 19.08.04, 14:23 |
Почему сразу тупой, я не знаю почему у тебя так получается, но в противном случае MSDN нас нагло обманывает ![]() |
Автор: MIA2000 20.08.04, 05:18 |
ребят данные есть, при передачи выводит, что 0 даных в стеке сокета, и след строчкой выводит передаваемую информацию, оч. прошу дайте рабочий кусок проги, что бы перенес и откомпилировал-Ю запустил и посмотрел в чем траблы, я так думаю, что это ошибка, причем мало заметная, поскольку втрой день перерываю инет, куча программ (к сожалению больших и сидеть разбираться с компилирование и что они там делают неохота), но ВСЕ, что они у себя проделывают со стеком сокета, я также переносил и смотрел у себя в проге, НИЧЕГО....!, все как было так и остаеться 0 данных и все. Поэтому оч. прошу мне помочь, проблемма эта меня просто достала!!!!!!!!! ![]() ![]() ![]() ![]() ![]() ![]() |
Автор: AlexSm 20.08.04, 05:31 |
У тебя вызов ioctlsocket идёт сразу за accept? Если так, то возврат 0 набранных на стеке сокета вполне может быть. А recv принимает данные потому, что она синхронная, и спокойненько дожидается твоих данных. Ты просто попробуй сделать цикл ожидания данных: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ULONG ulInSize = 0; while( !ioctlsocket( sock_new, FIONREAD, &ulInSize) && !ulInSize) Sleep( 10); И посмотри, работает на самом деле или нет. |
Автор: MIA2000 20.08.04, 06:13 |
Ни какой реакции.... Привожу код клиента и сервера (очю простой, необходимый "ПРОЖИТОЧНЫЙ" минимум) ![]() Проверял по breakpoint на ioctlsocket, размер как был 0 так и остаеться, программа входит в бесконечный цикл и "висит" ожидая данных, а данных нема..... Client ------------------------------ <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> #include "stdafx.h" #include "winsock.h" #include "iostream.h" #include <stdio.h> #include <io.h> #include <windows.h> #define PORT_ADDR 2000 char lpReturnedString[100]; char buffer[3]="aa"; char work_socket() { WSADATA wsaData; const int WINSOCK_VERSION = 0x0101; struct hostent *hp; WSAStartup(WINSOCK_VERSION, &wsaData); SOCKET sock; sock = socket(AF_INET,SOCK_STREAM,0); if (sock!=INVALID_SOCKET) { SOCKADDR_IN socketaddr, from_sin; socketaddr.sin_family = AF_INET; socketaddr.sin_addr.s_addr = INADDR_ANY; socketaddr.sin_port = PORT_ADDR; int iAddsize=sizeof(socketaddr); bind(sock,(struct sockaddr*)&socketaddr,iAddsize); hp=gethostbyname("127.0.0.1"); from_sin.sin_family=AF_INET; memcpy((char*)&from_sin.sin_addr,hp->h_addr,hp->h_length); from_sin.sin_port=PORT_ADDR; int iAddsize2=sizeof(from_sin); connect(sock,(struct sockaddr*)&from_sin,iAddsize2); send(sock,buffer,sizeof(buffer),0); } WSACleanup(); return(0); } void main() { work_socket(); } Server -------------------------------------------- <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> #include "stdafx.h" #include "winsock2.h" #include "iostream.h" #include <stdio.h> #include <io.h> #include <windows.h> #include <fcntl.h> #define PORT_ADDR 2000 #define BUF_SIZE 64 char lpReturnedString[100]; char bu[BUF_SIZE]; char work_socket() { WSADATA wsaData; WORD wVersionRequested; wVersionRequested = MAKEWORD(2,2); WSAStartup(wVersionRequested, &wsaData); SOCKET sock,sock_new; sock = socket(AF_INET,SOCK_STREAM,0); if (sock!=INVALID_SOCKET) { SOCKADDR_IN socketaddr, from_sin; socketaddr.sin_family = AF_INET; socketaddr.sin_addr.s_addr = INADDR_ANY; socketaddr.sin_port = PORT_ADDR; int iAddsize=sizeof(socketaddr); bind(sock,(struct sockaddr*)&socketaddr,iAddsize); listen(sock,5); int iAddsize2=sizeof(from_sin); while(1){ sock_new=accept(sock,(struct sockaddr*)&from_sin,&iAddsize2); DWORD dwLenIn; [B]ULONG ulInSize = 0; while( !ioctlsocket( sock_new, FIONREAD, &ulInSize) && !ulInSize) Sleep( 10); printf("%d",&ulInSize);[/B] dwLenIn = recv( sock_new, bu , ulInSize+64, 0); printf("%s",bu); printf("%d",dwLenIn); } } WSACleanup(); return(0); } void main() { work_socket(); } |
Автор: AlexSm 20.08.04, 06:23 |
1) Цитата send(sock,buffer,sizeof(buffer),0); } WSACleanup(); Ну дык ты делаешь попытку послать, и сразу прочищаешь сокеты.... 2) Цитата dwLenIn = recv( sock_new, bu , ulInSize+64, 0); А зачем ты прибавляешь 64??? FIONREAD сообщает тебе, скока можно считывать из сокета, а ты ещё 64 откуда-то хочешь получить.... 3) И зачем ты кстати биндишь клиента? |
Автор: MIA2000 20.08.04, 06:29 |
БОЛЬШОЕ ЧЕЛ. СПАСИБО ! Ctrl+Y by Leprecon ![]() ![]() ![]() ![]() Вот, что значит переделывать старые заготовки под новые задачи, точто, я и не замечад, что чишу сокет, а пребавляю 64, это ерунда, когда давал 0, я с горя 64 прибавил, что бы хоть строчку поймать. P.S. как все повернулось ошибка была не в серврере а в клиенте, мда..... ![]() |
Автор: Leprecon 20.08.04, 13:41 |
M MIA2000, пользуйся тегом кода. [ code][ /code] - без пробелов и не флуди в сообщениях. |