ページ 11

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

Posted: 2014年7月10日(木) 11:36
by kyanon
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;
}
 

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

Posted: 2014年7月10日(木) 12:55
by h2so5
すべてのsocketに対してsendしてください。

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

Posted: 2014年7月10日(木) 13:03
by Ryo
送受信を考える前に、まずは、1対複数で、「接続」するところをつくってみましょう(できれば正常な切断まで)

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

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

Posted: 2014年7月10日(木) 21:10
by taketoshi
Ryoさんのおっしゃられている通り1vs複数が先です。

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