バッファ メモリの割り当てに問題があります。私は 2 つのスレッドを持つ WF チャット アプリケーションを持っています。1 つは送信用、もう 1 つは受信用です。最初のクライアントがサーバーにメッセージを送信します。
private async void send_button_Click(object sender, EventArgs e)
{
string msg = this.messageTextBox.Text.Trim();
await Task.Run(() =>
{
buf = Encoding.ASCII.GetBytes(msg); //buf-buffer for send/rcv
clientSock.SendTo(buf, servEP);
this.Invoke((Action)delegate
{
this.dialogTextBox.Text += string.Format("client: {0}",
this.messageTextBox.Text.Trim());
});
buf = new byte[1024]; //allocate memory for receiving
});
}
次にサーバーが応答し、ここでバッファに問題が発生します。
private async void Form1_Load(object sender, EventArgs e)
{
clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
servIPEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 50000);
servEP = (EndPoint)servIPEP;
clientIPEP = new IPEndPoint(IPAddress.Any, 43000);
clientEP = (EndPoint)clientIPEP;
clientSock.Bind(clientEP);
while (true)
{
await Task.Run(() =>
{
//buf = new byte[1024] I tried to allocate here, but it's not working.
int rcv = clientSock.ReceiveFrom(buf, 0, buf.Length,
SocketFlags.None, ref servEP); // it returns right int value!
msg = Encoding.ASCII.GetString(buf, 0, rcv); //but buf is empty..
this.Invoke((Action)delegate
{
this.dialogTextBox.Text += rcv;
this.dialogTextBox.Text += string.Format("server: {0},rcv: {1}",
msg, rcv) + Environment.NewLine; //msg is empty...
});
});
}
}
サーバーがメッセージを再送信すると、クライアントで問題なく受信されるため、これは非常に奇妙です。ただし、最初のメッセージは常に null です。実際、最初のメッセージを受け取り、テストしました
int rcv = clientSock.ReceiveFrom(buf, ref servEP);
正しいintを返しますが、buf値はゼロです。