![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
マルチスレッドでチャットプログラムが組みたいです。
winsockを用いてVC++2010EEで組んでいます。
selectでのC/S型チャットプログラムは組めます。
マルチスレッドプログラムに関しては「猫でもわかるプログラミング」C言語編第1部第99章以降を参考にしました。
このサイトでのプログラムは分かるのですが、いざ自分のチャットプログラムに実装しようとするとどうすればいいのか分からなくなります。
やりたいこと(こうすればいいのだろうと思っていること)は
winsockの設定
while(1)
{
----SockBuf = accept(略);
--------if( SockBuf != INVALID_SOCKET)
--------{
------------MaxClient++;
------------Sock.push_back(SockBuf);
--------}
----thread()をSock[0]~Sock[MaxClient-1]ごとにスレッドで動かしたい。
----その他の処理
}
unsigned __stdcall thread()
{
----recv(略)
----その他の処理
}
どのようにしたらいいのか分からないので教えてください。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
ちょいと適当過ぎましたかねぇ…。
#2の疑似コードだと、
・全クライアントへのsend()が完了するまで、共有メモリを保護しないとならない。
・接続断の場合が考慮されていない。
などなど……。
まぁ、そこらへんはよろしく処理して下さい。ということで……。
考え方の1つの参考にでもして下さいな。
プロトコル次第っていうのもありますが。
Windowsであるかは不明ですが、IRCサーバのソースとかが参考に……なるかなぁ。
他のサーバとの同期処理とかは不要でしょうけどねえ。
No.2
- 回答日時:
>出来たらforループを使わずに、
どこからforループ出てきたのかが……
マルチスレッドとselect()だと
http://x68000.q-e-d.net/~68user/net/c-echo-2.html
とか参考になります…かねぇ。
クライアント側は現状で出来ているという「C/S型チャットプログラム」のままとして、
サーバ側では…
accept()で作成されたソケットを専用のスレッドに渡して処理…でしょう。
発言内容を他のクライアントにも送信する為の「共有メモリ」(同一プロセスですからサイズ決めうちでもかまわんでしょう)
発言内容に設定完了を通知する「イベント」、
共有メモリのアクセス制御の為の「同期オブジェクト」などを用意して……
while(!EndFlag) {
FD_ZERO()
FD_SET()
select() //上記のFD_SETしたものを第1引数(受信確認)に、200ms程度でタイムアウトするように設定
if(FD_ISSET()) {
// 受信データ処理
// 受信内容に応じてもろろ処理
}
// 受信内容が発言内容ならば、同期オブジェクトで書き込み権限取得して、共有メモリに書き込み、イベントを設定する。
// 同期オブジェクトで権限取得出来なかったら、次のループの時に際取得。
// WaitForSingleObject()で発言内容のイベントが立ったら、send()でクライアントに送信する。
}
ってな感じのループで処理できるんじゃないでしょうかね?
# 発言内容設定完了イベントを誰がクリアするのか…とか、その辺りはもう少し考慮が必要でしょうけどね…。
# エラー処理とかそういうところは入っていませんが…よろしく処理して下さい。
>Sock[0]、Sock[3]、Sock[7]
>から受信があったとしたら
>3つのスレッド(プロセス?)が起動して処理が終わったら消え・・・・・
>というようなことがしたいのですが、
クライアントが切断するまではスレッドは生かしたままでいいと思いますけどね。
1発言(?)ごとにスレッド起こすのはムダでしょう。
No.1
- 回答日時:
>selectでのC/S型チャットプログラムは組めます。
であれば……
作成したスレッド中でしょりすればよいかと。
クライアント側はあくまでもサーバと1対1の通信のみにして、サーバ側で各クライアントからの発言を他のクライアントに送る。
ということになるでしょうね。
サーバ側をやったことはありませんので細かいところまでは不明ですが。
私がやったことあるのはクライアント側で、複数のPOPサーバとおしゃべりしてみましょう…って程度ですので。
# select()じゃなくてWSAAsyncSelect()でメッセージ処理してましたけど。
# 同期処理はちょっとハマりましたけどね。設計がイマイチだからですが。
英語ですが下記ページとか見てみてはどうですかね?
http://msdn.microsoft.com/en-us/library/windows/ …
Complete Winsock Server Codeで…
// Accept a client socket
で接続受けた後辺りから、
// cleanup
のclosesocket()までがスレッドで処理する範囲になるでしょう。
送受信はselect()で面倒見る必要がありますし、
このサンプルでは早々にlisten()のソケット閉じていたりはしますが。
# SOMAXCONNのコネクション受け付けるようにしているわりには接続1個で閉じてる。
この回答への補足
>作成したスレッド中でしょりすればよいかと。
済みません。もうちょっと詳しくお願いします。
出来たらforループを使わずに、
Sock[0]、Sock[3]、Sock[7]
から受信があったとしたら
3つのスレッド(プロセス?)が起動して処理が終わったら消え・・・・・
というようなことがしたいのですが、
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# 参考にいろいろとc言語、c++言語プログラミングでレジストリーを操作したいのですが、無料配布のc++ 3 2022/12/22 01:49
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- システム CPUの問題について 2 2022/07/09 12:04
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- JavaScript プルダウンから1個選んで、豆知識を出すプログラム。 2 2022/06/21 17:27
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ASPとCGIの違い
-
三菱GOTの画面切り替えについて
-
腕時計の時報をならないように...
-
ボタンが活性化の場合とは、ボ...
-
ポップアップでウィンドウを表...
-
ASP Session変数名の取得
-
登録後、呼び出し元ページに戻...
-
フォルダ改行
-
jspファイルで注文フォームの合...
-
セッションタイムアウト時にエ...
-
Wi-Fiのパスワードが指定なしと...
-
C言語で今まで表示していた画面...
-
ASP.NET 画面遷移前の状態を保...
-
リクエストに応じたselectedの...
-
JavaScriptのsubmit()がされない
-
漏電遮断器の黄色ボタンと白色...
-
グローバルIPアドレスの変更タ...
-
困っています
-
jspでの表示の仕方
-
「<c:forEach タグが終了し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
NetworkStreamからのRead()で、...
-
IIS+VBScriptでの処理待ちについて
-
ハウスキープ処理について
-
CPUを2つ搭載するといいのです...
-
<%@ language="VBScript" %>
-
PerlからDB接続し、データ登録...
-
CGI(Perl)のメッセージボックス...
-
別のサーバにリクエストを飛ば...
-
ASP.NET MVCのAjaxフォーム検証
-
チャット開発に向いている言語
-
画面サイズ取得について
-
Webサービスについて(基になる...
-
VC++のHTTP通信
-
サーバ上でアプリケーションを...
-
Socket通信で、通信終了のイベ...
-
ASPとCGIの違い
-
サーバーの仕組みについて
-
CSocket通信での待機処理について
-
Perlで処理の進行状況をユ...
-
アンケートの回答時間を計り,...
おすすめ情報