接続している全クライアントに送信するには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kyanon

接続している全クライアントに送信するには

#1

投稿記事 by kyanon » 9年前

visual c++ 2010 Expressでwinsockを用いたソケット通信の学習をしています。1対1のやり取りはできたのですが、
1対複数の時、接続している全クライアントにメッセージを送信するにはどのようにしたらよいでしょうか?

コード:

 
/*******************
** 送受信スレッド **
*******************/
unsigned __stdcall send_recvThread(void *)
{	
	while(1)
	{
		// メッセージを受信
		nResult = recv(new_socket, message, sizeof(message), 0);
		if(nResult == SOCKET_ERROR)
		{
			error_code = WSAGetLastError();

			// 強制終了の場合
			if(error_code == WSAECONNRESET)
			{
				printf("予期しない切断が起こりました。IP:%s, port;%d\n" , inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
				break;
			}else{
				printf("受信に失敗しました。エラーコード%d\n" , WSAGetLastError());
				break;
			}
		}

		if(nResult == 0)
		{
			printf("ホストは切断しました。IP:%s, port;%d\n" , inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
			break;
		}else{
			message[nResult] = '\0';		// 受信バッファの後ろにNULLを付加

			// 終了の合図
			if(strcmp(message , "exit\n") == 0)
			{
				puts("クライアントが接続を切りました。\n");
				break;
			}
		}

		// 受信したメッセージを表示
		puts("メッセージを受信しました。\n");
		printf("%s:%d - %s\n" , inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), message);

		// 受信したメッセージをクライアントに送信
		if(send(new_socket, message, strlen(message), 0) != strlen(message))
		{
			printf("送信に失敗しました。エラーコード%d\n" , WSAGetLastError());
			break;
		}
		puts("メッセージを送信しました。\n");
	}
	shutdown(new_socket, 2);
	closesocket(new_socket);
	_endthreadex(0);
	return 0;
}
 

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 接続している全クライアントに送信するには

#2

投稿記事 by h2so5 » 9年前

すべてのsocketに対してsendしてください。

Ryo

Re: 接続している全クライアントに送信するには

#3

投稿記事 by Ryo » 9年前

送受信を考える前に、まずは、1対複数で、「接続」するところをつくってみましょう(できれば正常な切断まで)

そうすれば、「1」側では、複数に対して送信するためのソケットを相手の数だけ生成・管理することになるとわかります

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: 接続している全クライアントに送信するには

#4

投稿記事 by taketoshi » 9年前

Ryoさんのおっしゃられている通り1vs複数が先です。

接続待機用のlistenソケットを用意して接続が成功したクライアントからaccept関数の戻り値を使い別のソケット変数に保存していきます
接続状態を構造体等で管理し、接続が確立しているソケットに対してfor文でメッセージを送れば完成です。

閉鎖

“C言語何でも質問掲示板” へ戻る