Подскажите пожалуйста пример (исходник) socks5 сервера. Не пойму никак с редиректом. Хочу посмотреть как люди делают. Мой код набрал в инете по кускам которые как правило все нерабочие. Авторизацию проходит нормально но вот на редиректе стопорит (( Код (Text): #define FD_SETSIZE 2 #include <winsock.h> #include <windows.h> #include <wininet.h> #include <winreg.h> #include <stdio.h> #pragma comment(linker,"/MERGE:.rdata=.text /entry:entry") #pragma comment(linker,"/MERGE:.data=.text /SECTION:.text,EWR") #pragma comment(lib, "wininet.lib") #pragma comment(lib, "ws2_32.lib") #define PORT 1080 //port! DWORD WINAPI client_thread(LPVOID); int redirect(DWORD,DWORD); typedef struct s5rq_Auth { BYTE ver; BYTE nmetod; BYTE metods; }; typedef struct s5rq_AddrCl { BYTE ver; // 5 BYTE cmd ; // 1 - CONNECT BYTE reserved; // 0 BYTE AType; // 1 - IPv4; 3 - domain name; 4 - IPv6 DWORD dstip; WORD dstport; // Байты в сетевом порядке, т. е. htons(Port); }; int sc_read(SOCKET s,char *buf,int len){ FD_SET test; TIMEVAL time_; int can_read, cnt; test.fd_count = 1; test.fd_array[0] = s; time_.tv_sec = 5; time_.tv_usec = 0; do { can_read = select(0,&test,NULL,NULL,&time_); cnt = recv(s,buf,1,0); len--; buf++; } while((cnt != 0) && (can_read) && (len != 0)); return 0; } void text_dump(char *buf, unsigned int len) { for(unsigned int i=0;i<len;i++) { int c = 0; c = *buf; c &= 0x000000ff; printf("\\x%.2x",c); buf++; } printf("\n"); } //s0x0r c0de int entry() { DWORD hsock; struct sockaddr_in sin; WSADATA wsa; WSAStartup(0x202,&wsa); hsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sin.sin_family = AF_INET; sin.sin_addr.s_addr=INADDR_ANY; //a little subroutine, my habbits __asm { mov ax,PORT xchg al,ah mov word ptr [sin.sin_port],ax } printf("bind\t\t...\n"); bind(hsock, (struct sockaddr *)&sin, sizeof(sin)); printf("listen\t\t...\n"); listen(hsock, 10); while(TRUE) { CreateThread(NULL,0,&client_thread,(SOCKET *)accept(hsock, 0, NULL),0,0); } return 0; } DWORD WINAPI client_thread(LPVOID lpParam) { struct sockaddr_in sin; DWORD hsock; struct s5rq_Auth request; struct s5rq_AddrCl request_Addr; fd_set fds_read; printf("new thread\t >>>\n"); u_long ulVal = 1; int iCtlRes = 0; FD_ZERO( &fds_read ); FD_SET((SOCKET)lpParam, &fds_read); TIMEVAL tv = {0}; tv.tv_sec= 500; int iSelectResult = select(0, &fds_read, NULL, NULL, &tv); recv((SOCKET)lpParam,(char *)&request,sizeof(request),0); if (request.ver == 5 && request.metods == 0) { printf("recv 5 1 0\t...\n"); request.ver = 5; request.nmetod = 0; printf("send 5 0\t...\n"); //ulVal = 1; //iCtlRes = ioctlsocket((SOCKET)lpParam, FIONBIO , &ulVal); send((SOCKET)lpParam, (char *)&request, 8, 0); } else { printf("recv thread stoped \t...\n"); return 0; } recv((SOCKET)lpParam,(char *)&request_Addr,sizeof(request_Addr),0); if (request_Addr.ver == 5 && request_Addr.cmd == 1 && request_Addr.AType == 1) { printf("recv 5 1 0 1 [IP][PORT]\t..."); text_dump((char *)&request_Addr,sizeof(request_Addr)); sin.sin_family = AF_INET; sin.sin_port = request_Addr.dstport; memcpy(&(sin.sin_addr),&(request_Addr.dstip), sizeof(sin.sin_addr)); hsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); int iConnectResult=connect(hsock, (struct sockaddr *)&sin, sizeof(sin)); if (iConnectResult != SOCKET_ERROR) { printf("connecting\t...\n"); request_Addr.ver = 5; request_Addr.cmd = 0; request_Addr.reserved = 0; request_Addr.AType = 1; printf("connect OK\t...\n"); send((SOCKET)lpParam, (char *)&request_Addr, sizeof(request_Addr), 0); printf("send 5 0 0 1 [IP][PORT] ..."); text_dump((char *)&request_Addr,sizeof(request_Addr)); } else { request_Addr.ver = 5; request_Addr.cmd = 1; request_Addr.reserved = 0; request_Addr.AType = 1; if(send((SOCKET)lpParam, (char *)&request_Addr, sizeof(request_Addr), 0) == SOCKET_ERROR)// return SOCKET_ERROR; printf("send 5 1 0 1 [IP][PORT]\t..."); text_dump((char *)&request_Addr,sizeof(request_Addr)); return SOCKET_ERROR; } printf("redirect\t...\n"); redirect(hsock,(SOCKET)lpParam); } return 0; } int redirect(DWORD server, DWORD client) { char buffer[1024]; fd_set fd; while(TRUE) { FD_ZERO(&fd); FD_SET(client, &fd); FD_SET(server, &fd); select(0, &fd, 0, 0, 0); if(FD_ISSET(client, &fd)) { int client_recv=sc_read(client, buffer, sizeof(buffer)); if(client_recv== SOCKET_ERROR) { printf("recv() client error\t- %d\n",GetLastError()); goto quit; } int client_send=send(server, buffer, client_recv, 0); if(client_send == SOCKET_ERROR) { printf("send() client error\t- %d\n",GetLastError()); goto quit; } } if (FD_ISSET(server, &fd)) { int server_recv=sc_read(server, buffer, sizeof(buffer)); if(server_recv== SOCKET_ERROR) { printf("recv() server error\t- %d\n",GetLastError()); goto quit; } int server_send=send(client, buffer, server_recv, 0); if(server_send == SOCKET_ERROR) { printf("send() server error\t- %d\n",GetLastError());<<< !!!!!!!!!!!!! GetLastError() =10054 goto quit; } } } quit: closesocket(client); closesocket(server); return 0; } Спасибо.
s0larian Вы про это ? http://seo-analiz.info/2008/05/29/kak-sdelat-svoj-proksi-server Да не, я тут просто по программировать хотел. Вот уже нашел рабочий, правда без авторизации и только TCP UDP но! рабочий Кому интересна тема ... http://hack-expo.void.ru/groups/hellknights/rel/SOCKS5Proxy.Asm