ページ 11

自作関数でreturnにSOCKADDR_INの型を使いたい

Posted: 2012年7月14日(土) 22:00
by 8492飛行隊
先日お世話になった 8492飛行隊 です。

udp通信でデータを受信して"SOCKADDR_INの型もの"を返す関数を作っています。

この"SOCKADDR_INの型もの"をsentoの第四引数にそのまま代入して

送信元に送信データをそのまま返信するプログラムを作りたいです。

そのためには自作関数を作らなければいけません。

しかし返り値に"SOCKADDR_INの型もの"をいれると

'SOCKADDR_IN' から 'int' に変換できません。

と出てきました。

キャストもできませんでした。

説明が下手ですみません。

よろしくお願いします。

問題の関数

コード:

int UDPServer(unsigned short PortNo)
{

	SOCKET s = socket(AF_INET,SOCK_DGRAM,0);
	if(s<0)//ソケットエラー
	{
		return -1;
	}
	
	SOCKADDR_IN sockaddrin;
	memset(&sockaddrin,0,sizeof(sockaddrin));
	sockaddrin.sin_family = AF_INET;
	sockaddrin.sin_port = htons(PortNo);

	if(SOCKET_ERROR==bind(s,(LPSOCKADDR)&sockaddrin,(int)sizeof(sockaddrin)))
	{
		closesocket(s);
		return -2;//bindエラー
	}
	char buff[1024];
	SOCKADDR_IN from;
	int fromlen=(int)sizeof(from);

	while(1)//受信の無限ループになっています。
	{
		int re=recvfrom(s,buff,(int)sizeof(buff)-1,0,(SOCKADDR*)&from,&fromlen);//受信するまでここで停止
		if(re!=SOCKET_ERROR)//エラーで無ければ表示
		{
			buff[re]='\0';
			printf(buff);
		}
	}

	closesocket(s);
	return from;
}

Re: 自作関数でreturnにSOCKADDR_INの型を使いたい

Posted: 2012年7月14日(土) 22:11
by みけCAT
単純に関数の戻り値の型をSOCKADDR_INにすればいいだけではないのですか?

Re: 自作関数でreturnにSOCKADDR_INの型を使いたい

Posted: 2012年7月14日(土) 22:14
by 8492飛行隊
僕もその方法を試してみましたが

そうすると

return -1 と return -2 の箇所でエラーが出てしまいます。

Re: 自作関数でreturnにSOCKADDR_INの型を使いたい

Posted: 2012年7月14日(土) 22:20
by みけCAT
返り値はint型で、SOCKADDR_IN型のデータを受け取るためのポインタを引数に追加するという方法はどうですか?

コード:

int UDPServer(SOCKADDR_IN* retsai,unsigned short PortNo) {
    /* 中略 */
    closesocket(s);
    (*retsai)=from;
    return 0;
}

Re: 自作関数でreturnにSOCKADDR_INの型を使いたい

Posted: 2012年7月17日(火) 15:12
by 8492飛行隊
すみません。

返事が遅れました。

みけCATさんの助言をいただいてうまくできました。

最後にいくつか質問させていただきますが、

recvfromはclosesocketをしない限りずっと受信し続けようとするのですか。

Re: 自作関数でreturnにSOCKADDR_INの型を使いたい

Posted: 2012年7月18日(水) 20:21
by 8492飛行隊
すこし説明がおかしかったので修正します。

recvfrom(c言語)はいつ次の処理に移るのですか。

データを受信したあとですか?

デバッグのときrecvfromのところでとまっています。

Re: 自作関数でreturnにSOCKADDR_INの型を使いたい

Posted: 2012年7月19日(木) 00:48
by Poco
8492飛行隊 さんが書きました:すこし説明がおかしかったので修正します。

recvfrom(c言語)はいつ次の処理に移るのですか。

データを受信したあとですか?

デバッグのときrecvfromのところでとまっています。
基本的に受信した後です。
ブロッキングモード、ノンブロッキングモードで検索してみてください。