Предполагаю ошибки и ряд некорректностей:
...
#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. Ты передаешь адрес сокета. В следующей итерации по этому адресу будет другое значение и предыдущая нить вполне может им воспользоваться.
*/
...
По-моему, так.