多人数のチャットソフトを考えています
winsockを使ってプログラミングしています。
1対1のチャットはできたのですが、サーバを挟んで1対多のチャットがうまくいきません。
サーバがクライアントごとにスレットを作って、acceptするたびにできるディスクリプタを配列に格納して、それを元に送信してきたクライアント以外に送るということをしたいと思っています。
説明下手ですいません。。。。
サーバ↓↓↓
・・・・・・・・・初期化は略・・・・・・・・・・・・・・・・・・・・
while(1){
Csock[i] = accept(s,(struct sockaddr *) &Saddr, &Ssize);
CreateThread(Csock[i]); //クライアントごとにスレッドを作ってるつもり
i++;
}
/**CreateThreadで作るスレッド**********/
unsigned __stdcall recvthread(void *lpx) //lpxにはクライアントのディスクリプタを格納
{
fd_set fds, readfds;
int sock = *(int *)lpx;
int recvSize;
char recvbuf[256];
FD_ZERO(&readfds);
FD_SET(sock, &readfds);
while(1)
{
memcpy(&fds, &readfds, sizeof(fd_set));
memset(recvbuf, 0, sizeof(recvbuf));
select(0, &fds, NULL, NULL, NULL);
if (FD_ISSET(sock, &fds))
{
WaitForSingleObject(mutex, INFINITE);
recvSize = recv(sock, recvbuf, sizeof(recvbuf), 0);
Send(sock,(const char)recvbuf);
ReleaseMutex(mutex);
if(recvSize == 0)
{
printf("通信終了\n");
closesocket(sock);
break;
}
if(recvSize == -1)
{
printf("socket errer (recv)\n");
closesocket(sock);
break;
}
}
}
return 0;
}
void Send(int sock,char recvbuf)
{
for(int j=0;j<5;j++)
{
if(Csock[j]==sock)
continue;
send(Csock[j],(const char*)recvbuf,sizeof(recvbuf),0);
}
}
これを実行するとスレッドが無数に作成され、強制終了させられてしまいます。
初級者なのでプログラムのミスがあったら教えて下さい。
違うアイディアもあったら教えて欲しいです。見にくいと思いますがよろしくお願いします。。。。
お礼
これをもとに勉強させていただきます。 ありがとうございます。