質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

3回答

4692閲覧

win32APIの複数クライアントについての質問です。

ayane.ch

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2015/11/12 18:23

win32APIでwinsockを利用しています。

サーバとクライアント1つずつであれば問題なく文字のやり取りができるのですが、
クライアントを複数にした場合のプログラムがわかりません。

WSAAsyncSelect関数を使用しており、

現在力づくで、acceptした時にsockの数を増やすような形(下記のような)感じなのですが、
これだとクラアントが10個になった時、10個書き他の処理も全部書き足す結果に…と思いました。

case WM_SOCKET:
switch (WSAGETSELECTEVENT(lParam)) {

//サーバ側。 case FD_ACCEPT: //クライアントからの接続許可。 len = sizeof(client); sock1 = accept(sock, (struct sockaddr *)&client, &len); sock2 = accept(sock, (struct sockaddr *)&client, &len); sock3 = accept(sock, (struct sockaddr *)&client, &len);

恐らく、acceptの時にできる新しいsocketは1つにまとめる方法があるのかと思いましたので、
そのような方法があれば教えてください。
また他にも良い方法があればご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

具体的で無くて恐縮ですが、

一般的に、複数のクライアントから接続を受け付けるサーバーのアプリは、接続ごとにスレッドを立ち上げると思います。

つまり、1つのスレッドで複数の接続を扱うコードを書くのではなくって、1つの接続を扱うコードを接続ごとにスレッドを立ち上げる(呼び出す?)感じでしょうか。


おそらく、accept() したら CreateThread() で、接続ごとに処理関数を呼び出す形になると思います。

「マルチスレッド」 「サーバー」 とかで検索すると有用な情報をゲットできると思います。

投稿2015/11/12 22:18

編集2015/11/12 22:45
T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。
ご存知かと思いますが、非同期通信ですから、個別のスレッドを構築する必要はありません。

また、これもご存じだと思いますが、TCPでは、リスニング(受付)用ソケットと、通信用ソケットの2種類のソケットを使います。受付用1つから、接続要求のあるたびに通信用ソケットをaccept関数で生成し、以降は通信用ソケットでデータの送受信を行います。

非同期のTCP通信の例が、ここにあります。
書籍「Eternal Windows」より
http://eternalwindows.jp/network/winsock/winsock05s.html

上記サイトを参考にすると

cpp

1LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 2{ 3... 4static SOCKET socServer[10];//WM_DESTROYメッセージ受信(自アプリ終了)時に、閉じられていない通信ソケットを閉じるため(これをしないと、通信相手が困る)に、通信ソケットハンドルをここに記憶。 5... 6switch (uMsg) { 7case WM_CREATE: 8//配列socServerを初期化(ぜんぶの要素をINVALID_SOCKETにする) 9 10case FD_ACCEPT: 11//acceptで通信用ソケットハンドルを得る。socServer配列のまだ割り当てていない配列要素(INVALID_SOCKETの要素)へ格納。 12 13case FD_READ: 14//メッセージのwParamに通信用ソケットハンドルが入っており、これを使って受信し、他の任意の処理をする。クローズしたときには、socServer配列からも削除。 15 16case FD_CLOSE: 17//メッセージのwParamに通信用ソケットハンドルが入っており、これを使ってクローズする。socServer配列からも削除。 18 19case WM_DESTROY: 20//socServer配列の中身を調べ、まだ閉じていない通信用のソケットをクローズ。 21}

のような感じです。
サンプルコードでは、nMaxSocketCount を超えて接続が来たときに、うまくいかなくなってしまいますが...

投稿2015/11/13 02:39

編集2015/11/13 02:45
hsk

総合スコア728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

検索ワード
Winsock TCP 1対多
で、検索してみてください。方法他が検索できるはずです。
簡単な実装例は、Cでなくても良ければ、
NonSoft さんあたりに、サンプルがあります。
IP パケット上での実装をする時は、~~、OSI参照モデル位は、観ておいた良いかも。
⇒初見で、意味は分からなくても良いので、ざっと眺めてください。そのうち理解できます。
観たかどうかで、後々あっと思う事が違うかも。

C & Windows API のサンプルでは、2005年以前の場合等古い記事の物は、
開発環境が、現在のVS20XXとかなり違う場合があるので、注意してください。
MS-C 4.x 系:古すぎ
VS97 / VS98:古すぎ
VS2002 :不出来なので使用しない方が良い。
VS2003 :業務用ではそこそこ使われた様子、Webフォームが良かったが、他陣営の圧力で無かった事に
VS2005 / VS2008:すでに、お役御免
VS2010 / VS2012 / VS2013 / VS2015:可能であれば、VS2015を使う

書籍は、古いところでは、ASCII 出版の本があります。
サイトは、
猫でもわかるプログラミング
Win API リファレンス
で、検索すれば有名どころがでます。

投稿2015/11/12 23:52

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問