目次 - 3.関数 - 3.4UDPソケット - SDLNet_UDP_Send

SDLNet_UDP_Send

int SDLNet_UDP_Send(UDPsocket sock, int channel, UDPpacket *packet)

sock
有効なUDPsocket
channel
パケットを送信するチャネル
packet
送信するパケット

packetを指定のsockソケットを使って, 指定のchannelまたはパケットのアドレスに送信する. channelが-1でなければ, パケットはチャネルにバインドされた全てのアドレスに送信される. ソケットsockのチャネルが送り先にバインドされていなければ, パケットはどこへも送信されない! channelが-1ならば, 送り先としてパケットのアドレスが使われる. パケットのフィールドlenに送信するパケットの長さを設定することを忘れてはならない! メモ: packet->channelにはこの関数に渡したチャネルが設定される. メモ: パケットの最大サイズは, 中間経路のMTU(Maximum Transfer Unit)で制限される. 小さいもので250byte(一部のPPP), 大きいもので1500byte(イーサネット)になりうる. パケットの制限を超えたものは断片化され, 断片が失われるとパケット全体を破棄しなければならなくなり, 通信の信頼性が低下する.

戻り値: 送信した送信先の数. 失敗のとき0. チャネルは複数の送信先を指定できる. その場合は複数のパケットを送信するので, 成功のとき常に1を戻すとみなしてはならない. 残念ながら, チャネルにバインドされた送信先の数を得る方法はない. よって, チャネルにバインドしたとき記憶するか, 0を戻したとき全てのチャネルで失敗したとみなすしかない.

サンプルコード

// パケットチャネルchannelを使ってUDPsocketでパケットを送信する
//UDPsocket udpsock;
//UDPpacket *packet;
int numsent;

numsent=SDLNet_UDP_Send(udpsock, packet->channel, packet);
if(!numsent) {
    printf("SDLNet_UDP_Send: %s\n", SDLNet_GetError());
    // ここで送信に失敗した場合の処理を行う
    // 恐らくチャネルにアドレスがバインドされていないだけである...
}

内部チャネルの設定で1つのパケットを送信する方法は次の通りである. 最終的には実際にはSDLNet_UDP_Sendを呼んでいる.

// 内部チャネルで1つのパケットを送信する
//UDPsocket udpsock;
//UDPpacket *packet;
int numsent;

numsent=SDLNet_UDP_SendV(sock, &packet, 1);
if(!numsent) {
    printf("SDLNet_UDP_SendV: %s\n", SDLNet_GetError());
    // ここで送信に失敗した場合の処理を行う
    // 恐らくチャネルにアドレスがバインドされていないだけである...
}

参照

SDLNet_UDP_Bind, SDLNet_UDP_SendV, SDLNet_UDP_Recv, SDLNet_UDP_RecvV, UDPpacket, UDPsocket

原文へのリンク

3.4.6 SDLNet_UDP_Send