Многонитевой portmapper
От: Д.С.  
Дата: 23.07.03 06:20
Оценка:
есть следующий исходный текст. не работает хоть убейся веником. т.е. работает, но неправильно. он должен (как) задумывалось перемэпить порт одного компутэра на порт другого. перемэпивает, но только как-то косо, муть какая-то приходит. в чем проблема в силу своей неособой грамотности понять не могу. где ошибка ? или этот весь текст сплошная ошибка ? где искать ?


#include <windows.h>
#include <winsock.h>

#define SERVER_PORT 80
#define SERVER_HOST INADDR_ANY
#define TARGET_PORT 80
#define TARGET_HOST "proxy"
#define MAX_SERVER_CONNECTIONS 16
#define BUFFER_SIZE 16384
#define STACK_SIZE 32768

#define SERVER_DEVELOPMENT

#define CLIENT *((SOCKET *)lpParameter)
DWORD WINAPI ThreadProcedure (LPVOID lpParameter) {
    SOCKET target_socket;
    sockaddr_in addr;
    hostent *target_host;

    if (target_host=gethostbyname(TARGET_HOST)) {
        addr.sin_addr.S_un.S_addr = *(DWORD* ) target_host->h_addr_list[0];
        target_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if(target_socket!=INVALID_SOCKET) {
            addr.sin_family = AF_INET;
            addr.sin_port = htons (TARGET_PORT);
            if(connect(target_socket,(sockaddr *)&addr,sizeof(addr))!=SOCKET_ERROR) {
                char buffer[BUFFER_SIZE];
                int buffer_length=0;
                while (TRUE) {
                    buffer_length=recv(CLIENT,buffer,BUFFER_SIZE,NULL);
                    send(target_socket,buffer,buffer_length,NULL);
                    buffer_length=recv(target_socket,buffer,BUFFER_SIZE,NULL);
                    send(CLIENT,buffer,buffer_length,NULL);
                    }
                }
            #ifdef SERVER_DEVELOPMENT
            else MessageBox(0,"Connect()","Ошибка",MB_ICONSTOP);
            #endif
            }
        #ifdef SERVER_DEVELOPMENT
        else MessageBox(0,"Socket()","Ошибка",MB_ICONSTOP);
        #endif
        closesocket(target_socket);
        }
    #ifdef SERVER_DEVELOPMENT
    else MessageBox(0,"GetHostByName()","Ошибка",MB_ICONSTOP);
    #endif
    closesocket(CLIENT);
    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)    {
                        out=accept(in,NULL,NULL);
                        if (out) CreateThread(NULL,STACK_SIZE,ThreadProcedure,&out,NULL,NULL);
                        }
                    }
                #ifdef SERVER_DEVELOPMENT
                else MessageBox(0,"Listen()","Ошибка",MB_ICONSTOP);
                #endif
                }
            #ifdef SERVER_DEVELOPMENT
            else MessageBox(0,"Bind()","Ошибка",MB_ICONSTOP);
            #endif
            closesocket(in);
            }
        #ifdef SERVER_DEVELOPMENT
        else MessageBox(0,"Socket()","Ошибка",MB_ICONSTOP);
        #endif
        WSACleanup();    
        }
    #ifdef SERVER_DEVELOPMENT
    else MessageBox(0,"WSAStartup()","Ошибка",MB_ICONSTOP);
    #endif

    return 0;
}

// else MessageBox(0,"Егог","Ошибка",MB_ICONSTOP);


заранее благодарен ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.