Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.86] |
|
Сообщ.
#1
,
|
|
|
Добрый день sorry за беспокойство, но я столкнулся с проблеммой надеюсь на Вашу помощь.
Проблема в следующем: Вызываю ioctlsocket(hSocket, FIONREAD, &ulParam ); Ошибки не возвращает. Все проходит нормально я получаю сообщение. Hо в ulParam всегда возвращает ноль, хотя я уже послал килобайт 10 в этот сокет. Если не сложно покажите рабочий пример, с выводом количества инфы в стеке сокета. Спасибо. |
Сообщ.
#2
,
|
|
|
У тебя наверное сокет асинхронный
|
Сообщ.
#3
,
|
|
|
А причем тут асинхронность?
Он не переведен в не блокируемый режим. |
Сообщ.
#4
,
|
|
|
Цитата MIA2000, 19.08.04, 14:13 А причем тут асинхронность? При том что эта команда только для синхронных сокетов Цитата MIA2000, 19.08.04, 14:13 Он не переведен в не блокируемый режим. Правильно - он в нем по умолчанию |
Сообщ.
#5
,
|
|
|
Так, что же мне сделать? Я вроде все правильно делаю.... Если не сложно то подскажите где ошибка...
Вот кусок кода: ------------------------------------------------------------------------ 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); } |
Сообщ.
#6
,
|
|
|
Цитата 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? Может данных нет? Проверял? |
Сообщ.
#7
,
|
|
|
Цитата Братец Лис, 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). Угу, только у меня почему то все время наоборот получается... В чем дело? Может я тупой? |
Сообщ.
#8
,
|
|
|
Почему сразу тупой, я не знаю почему у тебя так получается, но в противном случае MSDN нас нагло обманывает
|
Сообщ.
#9
,
|
|
|
ребят данные есть, при передачи выводит, что 0 даных в стеке сокета, и след строчкой выводит передаваемую информацию, оч. прошу дайте рабочий кусок проги, что бы перенес и откомпилировал-Ю запустил и посмотрел в чем траблы, я так думаю, что это ошибка, причем мало заметная, поскольку втрой день перерываю инет, куча программ (к сожалению больших и сидеть разбираться с компилирование и что они там делают неохота), но ВСЕ, что они у себя проделывают со стеком сокета, я также переносил и смотрел у себя в проге, НИЧЕГО....!, все как было так и остаеться 0 данных и все. Поэтому оч. прошу мне помочь, проблемма эта меня просто достала!!!!!!!!!
-> -> -> -> -> |
Сообщ.
#10
,
|
|
|
У тебя вызов ioctlsocket идёт сразу за accept? Если так, то возврат 0 набранных на стеке сокета вполне может быть. А recv принимает данные потому, что она синхронная, и спокойненько дожидается твоих данных. Ты просто попробуй сделать цикл ожидания данных:
ULONG ulInSize = 0; while( !ioctlsocket( sock_new, FIONREAD, &ulInSize) && !ulInSize) Sleep( 10); И посмотри, работает на самом деле или нет. |
Сообщ.
#11
,
|
|
|
Ни какой реакции....
Привожу код клиента и сервера (очю простой, необходимый "ПРОЖИТОЧНЫЙ" минимум) Проверял по breakpoint на ioctlsocket, размер как был 0 так и остаеться, программа входит в бесконечный цикл и "висит" ожидая данных, а данных нема..... Client ------------------------------ #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 -------------------------------------------- #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(); } |
Сообщ.
#12
,
|
|
|
1)
Цитата send(sock,buffer,sizeof(buffer),0); } WSACleanup(); Ну дык ты делаешь попытку послать, и сразу прочищаешь сокеты.... 2) Цитата dwLenIn = recv( sock_new, bu , ulInSize+64, 0); А зачем ты прибавляешь 64??? FIONREAD сообщает тебе, скока можно считывать из сокета, а ты ещё 64 откуда-то хочешь получить.... 3) И зачем ты кстати биндишь клиента? |
Сообщ.
#13
,
|
|
|
БОЛЬШОЕ ЧЕЛ. СПАСИБО ! Ctrl+Y by Leprecon B) !
Вот, что значит переделывать старые заготовки под новые задачи, точто, я и не замечад, что чишу сокет, а пребавляю 64, это ерунда, когда давал 0, я с горя 64 прибавил, что бы хоть строчку поймать. P.S. как все повернулось ошибка была не в серврере а в клиенте, мда..... еще раз спасибо. |
Сообщ.
#14
,
|
|
|
M MIA2000, пользуйся тегом кода. [ code][ /code] - без пробелов и не флуди в сообщениях. |