Re[3]: Многонитевой portmapper
От: Аноним  
Дата: 24.07.03 08:19
Оценка:
Вот новые исходники, переписанные по-новой. Всё равно не работает хоть ты пасатижами застрелись ... вроде всё поправил, тем не менее ... в чем теперь дело ?

да, в теле главной нити есть вечный цикл. вообще программа предназначена для вечной работы в фоновом режиме. для того, чтобы из нее выходить надо родить окно, ловить кучу сообщений для этого окна и т.д. оно надо (хотя бы на текущий момент, когда сама "рабочая часть" не работает) ?


#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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.