есть следующий исходный текст. не работает хоть убейся веником. т.е. работает, но неправильно. он должен (как) задумывалось перемэпить порт одного компутэра на порт другого. перемэпивает, но только как-то косо, муть какая-то приходит. в чем проблема в силу своей неособой грамотности понять не могу. где ошибка ? или этот весь текст сплошная ошибка ? где искать ?
...
#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. Не надо. См. Некорр. 5return 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. Ты передаешь адрес сокета. В следующей итерации по этому адресу будет другое значение и предыдущая нить вполне может им воспользоваться.
*/
...
Огромное спасибо за ответ !
Даже не ожидал такого полного пояснения ...
Я конечно понимаю, что спасибо в карман не положишь, на стол не поставишь ...
Но пока могу только сказать еще раз спасибо !
Re[3]: Многонитевой portmapper
От:
Аноним
Дата:
24.07.03 08:19
Оценка:
Вот новые исходники, переписанные по-новой. Всё равно не работает хоть ты пасатижами застрелись ... вроде всё поправил, тем не менее ... в чем теперь дело ?
да, в теле главной нити есть вечный цикл. вообще программа предназначена для вечной работы в фоновом режиме. для того, чтобы из нее выходить надо родить окно, ловить кучу сообщений для этого окна и т.д. оно надо (хотя бы на текущий момент, когда сама "рабочая часть" не работает) ?
Здравствуйте, Д.С., Вы писали:
ДС>Огромное спасибо за ответ ! ДС>Даже не ожидал такого полного пояснения ... ДС>Я конечно понимаю, что спасибо в карман не положишь, на стол не поставишь ... ДС>Но пока могу только сказать еще раз спасибо !
лучше поставь оценку, а то и правда ни на стол, ни в карман...
... << RSDN@Home 1.1 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.