C# Socket发送不出去怎么办?

yippeeyn 2007-01-18 11:25:00
我写了一个异步发送的试验程序,对于局域网没有问题,可是外地上线的朋友却只收到一次数据,然而我这里发送了十次数据,最后我的程序停在那里不发了,请各位高手帮帮忙
我的程序是这样的

...
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里显示
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...发送成功
开始向客户端发送数据...

而客户端只收到一次数据,不知道怎么办了。
...全文
686 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2011-10-20
  • 打赏
  • 举报
回复
我在想,楼主是不是碰到了NAT问题
niulei 2011-10-20
  • 打赏
  • 举报
回复
因为我每次发送的数据的大小不一样,所以我是在发送之前设置一下
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());
}
}
niulei 2011-10-20
  • 打赏
  • 举报
回复
我碰到的也是这个问题,客户端发送给服务器转发的程序,发送一会,服务器就收不到了,但调试发现确实还在发送,而且socket的TCP也没有断!用你的方法试试
stoneson 2008-09-03
  • 打赏
  • 举报
回复
this.ClientCon.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, this.buf.Length);
是放在哪个位置
jason909 2007-01-19
  • 打赏
  • 举报
回复
[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);
}
jason909 2007-01-19
  • 打赏
  • 举报
回复
在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);

}
yippeeyn 2007-01-19
  • 打赏
  • 举报
回复
我也用同步发试过,结果是一样的,真搞不清楚,头都大了
yippeeyn 2007-01-19
  • 打赏
  • 举报
回复
我用的就是tcp
我已经发送了9次啊,而且在局域网内没有任何问题。我在本市网吧也试过了没有问题,只是外地的朋友通讯不上,不知道为什么了。
灰太狼 2007-01-19
  • 打赏
  • 举报
回复
用什么连的?在网络不是很好的情况下(尤其是异地发送),使用tcp连比udp好。
Red_angelX 2007-01-19
  • 打赏
  • 举报
回复
你这样写当然只发一次了
异步不是很好控制
我建议用同步发 异步收
bestshl 2007-01-19
  • 打赏
  • 举报
回复
结束挂起的异步发送。

[C#]
public int EndSend(
IAsyncResult asyncResult
);

参数
asyncResult
IAsyncResult,它存储此异步操作的状态信息。
返回值
如果成功,则将返回向 Socket 发送的字节数;否则会返回无效 Socket 错误。

你应该看看返回的是不是发送成功?
yippeeyn 2007-01-19
  • 打赏
  • 举报
回复
谢谢各位了,问题基本解决了
把做法写出来,大家帮我看看还有没有更好的方法
private byte[] buf[] = new byte[1024];
...
...
...
this.ClientCon.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer, this.buf.Length);
只加了这一句,把Socket发送缓冲区的大小和我使用的缓冲区的大小设的一样就好了
主要原因是对方网络不好,造成我这里发送超时
yippeeyn 2007-01-19
  • 打赏
  • 举报
回复
用了委托结果还是一样,晕死了

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧