Re[4]: Сокеты и потоки. Обмен данными между ними.
От: Аноним  
Дата: 20.02.03 12:16
Оценка:
Создал сообщения, пришлось для каждого клиента запускать еще один процесс, для получения
сообщений (это хорошо? есть другие варианты в данном случае?). Столкнулся с проблемой: все потоки сообщение получают, но
отправка данных клиенту работает только в том потоке, который отправил серверу "ALL". (причем send() везде возвращает нормальное значение)
Почему не работает отправка в других потоках?


DWORD id[10]={0,0,0,0,0,0,0,0,0,0};
int count = 0;
#define WM_ALLUSERS WM_USER+1000

main(){
...
client = accept(server,(sockaddr*)&sin_c,&i);
// создаем поток на каждого клиента
CreateThread(NULL,0,ThreadClient,(LPVOID)client,0,0);
...
}

DWORD WINAPI ThreadClient(LPVOID lpPar){
SOCKET client = (SOCKET) lpPar;
char buf[512];

// создаем поток каждому клиенту для получения сообщений
CreateThread(NULL,0,ThreadForMessage,(LPVOID)client,0,&id[count]);
count++;

memset(buf,0,512);
while(true){
int i = recv(client,buf,512,0); if(i<1) break;
if(lstrcmpi(buf,"ALL") == 0){
for(int index = 0;index <= count;index++){ // отправляем всем потокам сообщение
PostThreadMessage(id[index],WM_ALLUSERS,0,0);
}
}
memset(buf,0,i);
}
...
}

DWORD WINAPI ThreadForMessage(LPVOID lpParam){
SOCKET client = (SOCKET) lpParam;
MSG Msg;
while(true){
if(GetMessage(&Msg,NULL,0,0)){
if(Msg.message == WM_ALLUSERS){
int n = send(client,"I'm get message\0",16,0);
if(n==SOCKET_ERROR){
printf("\nError: %h",WSAGetLastError());
}else{
printf("\nSend: %d byte",n);
}
}
}
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.