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;
intsock = *(int *)lpx;
intrecvSize;
charrecvbuf[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);
}
}
これを実行するとスレッドが無数に作成され、強制終了させられてしまいます。
初級者なのでプログラムのミスがあったら教えて下さい。
違うアイディアもあったら教えて欲しいです。見にくいと思いますがよろしくお願いします。。。。
No.2ベストアンサー
- 回答日時:
気がついたことを幾つか。
1.accept()の第三引数には、第二引数に渡すバッファサイズをセットしておかないとダメです。
Ssize = sizeof( Ssize );
Csock[i] = accept( s, (struct sockaddr *)&Saddr, &Ssize );
たぶん、この値が不定値でエラーとなっているため、ブロッキングされずに、大量にスレッドが生成されているのかも?
2.一文字ずつ受信/配信より、一行ずつ処理しないと、多人数は表示がおかしくなります。
同時に入力されると、配信された文章がチャンポンになりませんか?
また、入力していた文章を、ログをみて書き直すこともあるでしょうから、
取り消しが出来るように、一行づつクライアントから送ってもらい、サーバで分散した方が、
使いやすいと思いますよ?
No.1
- 回答日時:
while(1){
Csock[i] = accept(s,(struct sockaddr *) &Saddr, &Ssize);
CreateThread(Csock[i]); //クライアントごとにスレッドを作ってるつもり
i++;
}
うん。これじゃあ確かにあっという間にスレッドが無数にできあがるよね。無限ループだから。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別スレッドからメインダイアロ...
-
WaitForSingleObjectの使い方に...
-
スレッドの安全な終了のさせ方
-
Linuxでスレッド優先度って変え...
-
スレッドがサスペンドされてい...
-
自作クラスのイベントを外部ハ...
-
DirectX LPDIRECT3DDEVICE9のマ...
-
マルチスレッドについて
-
マルチスレッドプログラム
-
Windows上で、シグナル(SIGTERM...
-
待機関数(WaitForMultipleObjec...
-
.netアプリへのSendMessageでフ...
-
VC++スレッドの正しい終了のさ...
-
スレッドにて同一メモリの書き...
-
マルチスレッドプログラミング...
-
VB2005 シリアル通信のClose処理
-
LinuxでDoEvents()同等機能
-
win32 スレッドのハンドルついて
-
緯度、経度の 10進法と 60進法...
-
Macターミナルで実行中のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
Windows上で、シグナル(SIGTERM...
-
スレッドの終了の仕方
-
スレッドの安全な終了のさせ方
-
CWnd::OnTimerのスレッドの取得
-
MFC通信プログラムマルチスレッ...
-
Linuxでスレッド優先度って変え...
-
.netアプリへのSendMessageでフ...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了はどうやるんで...
-
別スレッドからメインダイアロ...
-
マルチスレッドについて
-
マルチスレッドプログラミング...
-
別スレッドのデータを受信できない
-
特定のスレッドの破棄
-
.NetのBackgroundWorkerクラス...
-
msec単位のWait Timerが作れない!
おすすめ情報