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