C# Socket发送不出去怎么办?
我写了一个异步发送的试验程序,对于局域网没有问题,可是外地上线的朋友却只收到一次数据,然而我这里发送了十次数据,最后我的程序停在那里不发了,请各位高手帮帮忙我的程序是这样的
...
textBox1.AppendText("开始向客户端发送数据...");
client.BeginSend(buf, 0, bytesCount, SocketFlags.None, this.callbackOnServer1Send, client);
...
private void callbackOnServer1Send(IAsyncResult asResult)
{
int bytesCount = this.Server1.EndSend(asResult);
textBox1.AppendText("发送成功"+Environment.NewLine);
}
结果在textBox1里显示
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...
而客户端只收到一次数据,不知道怎么办了。 --------------------编程问答-------------------- 结束挂起的异步发送。
[C#]
public int EndSend(
IAsyncResult asyncResult
);
参数
asyncResult
IAsyncResult,它存储此异步操作的状态信息。
返回值
如果成功,则将返回向 Socket 发送的字节数;否则会返回无效 Socket 错误。
你应该看看返回的是不是发送成功? --------------------编程问答-------------------- 你这样写当然只发一次了
异步不是很好控制
我建议用同步发 异步收 --------------------编程问答-------------------- 用什么连的?在网络不是很好的情况下(尤其是异地发送),使用tcp连比udp好。 --------------------编程问答-------------------- 我用的就是tcp
我已经发送了9次啊,而且在局域网内没有任何问题。我在本市网吧也试过了没有问题,只是外地的朋友通讯不上,不知道为什么了。 --------------------编程问答-------------------- 我也用同步发试过,结果是一样的,真搞不清楚,头都大了 --------------------编程问答-------------------- 在callbackOnServer1Send()的方法中用一下委托和ui传消息
private delegate void SetValue(string con);
private void callbackOnServer1Send(IAsyncResult asResult)
{
int bytesCount = this.Server1.EndSend(asResult);
if(textBox.InvokeRequired)
{
textBox1.AppendText("发送成功"+Environment.NewLine);
} --------------------编程问答-------------------- [over write]
在callbackOnServer1Send()的方法中用一下委托和ui传消息
private delegate void SetValue();
private void callbackOnServer1Send(IAsyncResult asResult)
{
int bytesCount = this.Server1.EndSend(asResult);
if(textBox.InvokeRequired)
{
this.Invoke(new SetValue(SetValueToText),null);
}
}
priavte void SetValueToText()
{
textBox1.AppendText("发送成功"+Environment.NewLine);
} --------------------编程问答-------------------- 用了委托结果还是一样,晕死了 --------------------编程问答-------------------- 谢谢各位了,问题基本解决了
把做法写出来,大家帮我看看还有没有更好的方法
private byte[] buf[] = new byte[1024];
...
...
...
this.ClientCon.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, this.buf.Length);
只加了这一句,把Socket发送缓冲区的大小和我使用的缓冲区的大小设的一样就好了
主要原因是对方网络不好,造成我这里发送超时 --------------------编程问答-------------------- this.ClientCon.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, this.buf.Length);
是放在哪个位置 --------------------编程问答-------------------- 我碰到的也是这个问题,客户端发送给服务器转发的程序,发送一会,服务器就收不到了,但调试发现确实还在发送,而且socket的TCP也没有断!用你的方法试试 --------------------编程问答-------------------- 因为我每次发送的数据的大小不一样,所以我是在发送之前设置一下
private void videoBufferSend(Socket handler, byte[] byteData)
{
try
{
handler.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, byteData.Length);
// Begin sending the data to the remote device.
handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(videoBufferSendCallback), handler);
}
catch (Exception e)
{
MessagerichTextBox.Invoke(MessageTextBoxdel,e.ToString());
}
} --------------------编程问答-------------------- 我在想,楼主是不是碰到了NAT问题
补充:.NET技术 , C#