Re: Многонитевой portmapper
От: Vamp Россия  
Дата: 23.07.03 10:49
Оценка: 3 (1)
Предполагаю ошибки и ряд некорректностей:



...
#define CLIENT *((SOCKET *)lpParameter) // Некор. 1. Так делать - дурной тон.
...

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

...
                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);
                    }
                }
/*Некор. 2. Не вижу выхода из цикла
  Ошибка 1. Зря считаешь в строке ***, что сервер готов отвечать. Ты ему вполне мог отправить 1 байт, принятый первым recv(). Сервер ждет продолжения... Тут нужны select().
*/
            #ifdef SERVER_DEVELOPMENT
            else MessageBox(0,"Connect()","Ошибка",MB_ICONSTOP);
            #endif
//Некорр. 3. В высшей степени плохой стиль.
...
        closesocket(target_socket); // Обрати внимание - здесь мы никогда не окажемся...
    ExitThread(0); // Некорр. 4. Не надо. См. Некорр. 5
    
    return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR pCmdLine,int nCmdShow) {
...
                    SOCKET out;
                    while(TRUE)    {
                        out=accept(in,NULL,NULL);
                        if (out) CreateThread(NULL,STACK_SIZE,ThreadProcedure,&out,NULL,NULL);
/*Некорр. 5. Потоки в C/C++ создаются с помощью [msdn]_beginthreadex[/msdn]!
  Ошибка 2.  Ты передаешь адрес сокета. В следующей итерации по этому адресу будет другое значение и предыдущая нить вполне может им воспользоваться.
*/
...


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