UDP通信
Socketを使用
通常
// 送信先
IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("192.168.11.2"), 80);
// 送信データ
byte[] data = new byte[16];
// UDP ソケットの作成
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// TTL を設定
// TTLとは…→ http://e-words.jp/w/TTL-2.html
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, 255);
// データを送信
s.SendTo(data, 0, data.Length, SocketFlags.None, remoteIP);
ブロードキャスト
IPEndPoint remoteIP = new IPEndPoint(IPAddress.Broadcast, 10002);
byte[] data = new byte[16];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, 16);
// ブロードキャストはこれで許可を入れないといけないっぽい
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
s.SendTo(data, data.Length, SocketFlags.None, remoteIP);
UdpClient
ブロードキャスト
// ブロードキャスト用
IPEndPoint BroadCast = new IPEndPoint(IPAddress.Broadcast, PortNum);
// ソケットの作成
IPEndPoint UDPendpoint = new IPEndPoint(IPaddress, PortNum);
UdpClient UDP_Gen = new UdpClient(UDPendpoint);
UDP_Gen.Send(SendPacket, SendPacket.Length , BroadCast);
TCP接続
Socketクラスで行う
モジュール登録
サーバ(同期)
IPEndPoint ipEndpoint = new IPEndPoint(IpAddress, PortNumber);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// ソケットのバインド
server.Bind(ipEndpoint);
// 受け付け数の設定
server.Listen(10);
// 接続受け入れ開始
Socket Client = server.Accept();
//送受信開始
クライアント(同期)
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint remoteEP = new IPEndPoint(ipAddress, ServerPort);
// タイムアウトを設定
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1000);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
// 接続
client.Connect(remoteEP);
クライアント(非同期)
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint remoteEP = new IPEndPoint(ipAddress, ServerPort);
// 接続開始
client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);
//client.Connect(remoteEP);
//送受信開始
//コールバック関数
private void ConnectCallback(IAsyncResult ar){
Socket work = (Socket)ar.AsyncState;
work.EndConnect(ar);
}
送信
- NetworkStreamを使うと簡単っぽい?→調べよう!
- 送信は、アプリがスレッドで動こうが非同期で動こうが同期的に行っても問題ない
受信
同期
非同期
socketはクラス内関数で共有するソケット
//呼び出し
byte[] reciveByte = new byte[256];
socket.BeginReceive(reciveByte, 0, reciveByte.Length, 0, new AsyncCallback(ReciveCallback), reciveByte);
//コールバック関数
ReciveCallback(IAsyncResult ar){
int len = socket.EndReceive(ar);
//受信情報の取り出し
byte[] reciveBuffer = (byte[])ar.AsyncState;
}
接続先のIPアドレスを取り出す
Socket Client = server.Accept();
// 接続してきたクライアントのソケットからIPEndPointを取り出す
IPEndPoint ClientData = (IPEndPoint)client.RemoteEndPoint;
// ここから情報を抽出
IPAddress address = ClientData.Address;
最終更新:2009年01月14日 10:26