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

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

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

#1

投稿記事 by 8492飛行隊 » 13年前

先日お世話になった 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;
}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 13年前

単純に関数の戻り値の型をSOCKADDR_INにすればいいだけではないのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

8492飛行隊

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

#3

投稿記事 by 8492飛行隊 » 13年前

僕もその方法を試してみましたが

そうすると

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 13年前

返り値はint型で、SOCKADDR_IN型のデータを受け取るためのポインタを引数に追加するという方法はどうですか?

コード:

int UDPServer(SOCKADDR_IN* retsai,unsigned short PortNo) {
    /* 中略 */
    closesocket(s);
    (*retsai)=from;
    return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

8492飛行隊

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

#5

投稿記事 by 8492飛行隊 » 13年前

すみません。

返事が遅れました。

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

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

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

8492飛行隊

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

#6

投稿記事 by 8492飛行隊 » 13年前

すこし説明がおかしかったので修正します。

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

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

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

Poco
記事: 161
登録日時: 15年前

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

#7

投稿記事 by Poco » 13年前

8492飛行隊 さんが書きました:すこし説明がおかしかったので修正します。

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

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

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

閉鎖

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