Вот новые исходники, переписанные по-новой. Всё равно не работает хоть ты пасатижами застрелись ... вроде всё поправил, тем не менее ... в чем теперь дело ?
да, в теле главной нити есть вечный цикл. вообще программа предназначена для вечной работы в фоновом режиме. для того, чтобы из нее выходить надо родить окно, ловить кучу сообщений для этого окна и т.д. оно надо (хотя бы на текущий момент, когда сама "рабочая часть" не работает) ?
#include <windows.h>
#include <winsock.h>
#define SERVER_HOST INADDR_ANY
#define SERVER_PORT 80
#define TARGET_HOST "proxy.kes"
#define TARGET_PORT 80
#define MAX_SERVER_CONNECTIONS 16
#define BUFFER_SIZE 16384
struct connection_data {
SOCKET server;
SOCKET target;
bool connection;
};
DWORD WINAPI ToTarget (LPVOID lpParameter) {
char buffer[BUFFER_SIZE];
int to_target;
do {
to_target=recv((*((connection_data *)lpParameter)).server,buffer,BUFFER_SIZE,NULL);
if (to_target) send((*((connection_data *)lpParameter)).target,buffer,to_target,NULL);
else (*((connection_data *)lpParameter)).connection=FALSE;
} while ((*((connection_data *)lpParameter)).connection==TRUE);
closesocket((*((connection_data *)lpParameter)).server);
ExitThread(0);
return 0;
}
DWORD WINAPI ToServer (LPVOID lpParameter) {
char buffer[BUFFER_SIZE];
int to_server;
do {
to_server=recv((*((connection_data *)lpParameter)).target,buffer,BUFFER_SIZE,NULL);
if (to_server) send((*((connection_data *)lpParameter)).server,buffer,to_server,NULL);
else (*((connection_data *)lpParameter)).connection=FALSE;
} while ((*((connection_data *)lpParameter)).connection==TRUE);
closesocket((*((connection_data *)lpParameter)).target);
ExitThread(0);
return 0;
}
DWORD WINAPI ThreadProcedure (LPVOID lpParameter) {
connection_data connection;
connection.server=*((SOCKET *)lpParameter);
sockaddr_in addr;
hostent *host;
if (host=gethostbyname(TARGET_HOST)) {
addr.sin_addr.S_un.S_addr = *(DWORD* ) host->h_addr_list[0];
connection.target=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(connection.target!=INVALID_SOCKET) {
addr.sin_family = AF_INET;
addr.sin_port = htons (TARGET_PORT);
if(connect(connection.target,(sockaddr *)&addr,sizeof(addr))!=SOCKET_ERROR) {
connection.connection=TRUE;
CreateThread(NULL,NULL,ToServer,&connection,NULL,NULL);
CreateThread(NULL,NULL,ToServer,&connection,NULL,NULL);
while(connection.connection==TRUE) { }
}
}
}
ExitThread(0);
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR pCmdLine,int nCmdShow) {
WSADATA wsdata;
if (WSAStartup(MAKEWORD(2,0),&wsdata)!=SOCKET_ERROR) {
SOCKET in;
in=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(in!=INVALID_SOCKET) {
sockaddr_in addr_in;
addr_in.sin_family=AF_INET;
addr_in.sin_addr.S_un.S_addr=htonl(SERVER_HOST);
addr_in.sin_port=htons (SERVER_PORT);
if(bind(in,(sockaddr*)&addr_in,sizeof(addr_in))!=SOCKET_ERROR) {
if(listen(in,MAX_SERVER_CONNECTIONS)!=SOCKET_ERROR) {
SOCKET out;
while (TRUE) {
if(out=accept(in,NULL,NULL)) {
CreateThread(NULL,NULL,ThreadProcedure,&out,NULL,NULL);
}
}
}
}
closesocket(in);
}
WSACleanup();
}
return 0;
}