problem z gniazdami

0

Witam. Ostatnio kombinowałem z gniazdami pod konsole wszystko szło dobrze gdyby nie jeden pewien problem... otóż nie wiem co zrobić aby socket nasłuchiwał cały czas:
(fragment pochodzi z msdn)
Kod:

int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Server: Sending Data.";
char recvbuf[32] = "";

bytesRecv = recv( m_socket, recvbuf, 32, 0 );
printf( "Przyslali: %s", recvbuf);

bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );
int bytesRecv = SOCKET_ERROR;

tzn. co trzeba zrobić aby gniazdo po odebraniu danych nie kończyło nasłuchiwania tylko mogło odebrać dane jeszcze raz?
Pozdrawiam

0

hmm, s<ort>proboj</ort> sie no pobawic czyms takim jak "setsockopt"
<ort>niewiem</ort> na ile to pomoze, zobacz na msdn info o tym

pozdr.

0

witam
troszkę już napisałem w socketach (ale nie w C ani delphi)

	Server.sk.sin_family	= AF_INET
	Server.sk.sin_port	= htons(Server.Port)
	Server.sk.sin_addr.s	= htonl(INADDR_ANY)
	Server.Socket		= socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )

	IF Server.Socket = INVALID_SOCKET
		RestartServer()
		Return
	EndIF

	IF bind(Server.Socket, Server.sk, len(Server.sk))
		IF WSAGetLastError() = WSAEADDRINUSE
			'Port already in use
		Else
			'total bind error
		Endif
		RestartServer()
		Return
	EndIF

	IF listen(Server.Socket, 20)
		RestartServer()
		Return
	EndIF
/*pożyteczne dla okienka*/	WSAAsyncSelect(...)

no i teraz albo odbierasz połączenia: ClientSocket = accept(Server.Socket, Null, Null)
albo się łączysz wypisując drugą strukturę sockaddr_in

Remote[pos].sk.sin_addr.s = Host
Remote[pos].sk.sin_family = AF_INET
Remote[pos].sk.sin_port = htons(port)
Socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )
Remote[pos].Socket = Socket

IF Socket = INVALID_SOCKET
  [...error...]
Endif

/*dla okienka*/
Message = RegisterWindowMessageA("jakiś niepowtarzalny tekst")
IF WSAAsyncSelect(Socket, win.hwnd, Message, FD_CLOSE | FD_READ | FD_WRITE | FD_CONNECT) = SOCKET_ERROR
	[znowu error]
Endif

connect(Socket, Remote[pos].sk, len(Remote[pos].sk))
Remote[pos].ConnectionTimeout = 10 /* 10s max */

Piszę serwer proxy który już odbiera, wysyła i gromadzi pliki :)
jeśli to kogoś zaciekawi (jak pliki są indeksowane):
nazwy plików wyglądają tak:

01C4D4ED4F4C09DC-00C.6482EACD

01C4D4ED4F4C09DC to SystemTimeAsFileTime - czas utworzenia pliku
00C to ilość bajtów od GET do HTTP/1.x : /favicon.ico
rozszeżenie to IP serwera skąd ściągam dane

znalazłem ciekawy programik (też proxy) http://www.proxomitron.info/45/help/Contents.html - działa fajnie, kilka funkcji (pomysłów) zgapiam od niego

0

Nie wiem, ale coś było w Kody źródłowe -> Telnet. Tam wszystko działa :)

0

tzn. co trzeba zrobić aby gniazdo po odebraniu danych nie kończyło nasłuchiwania tylko mogło odebrać dane jeszcze raz?

umieść ten kod w pętli:
while ((bytesRecv = recv( m_socket, recvbuf, 32, 0 )) <> -1)

1 użytkowników online, w tym zalogowanych: 0, gości: 1