udp通讯报错误“远程主机强迫关闭了一个现有的连接”

Kenall 2011-09-19 03:00:05
新手正在研究UDP通讯,看别人的UDP自收自发程序拿来编译时候,发现好几个程序都存在这样的问题
下面是一个源程序。


using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SimpleUdpClient
{
public static void Main()
{
byte[] data = new byte[1024];
string input, stringData;
IPEndPoint ipep = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 9050);

Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);


string welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep);

IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;

data = new byte[1024];
//uint IOC_IN = 0x80000000;
//uint IOC_VENDOR = 0x18000000;
//uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
//server.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);
try
{
int recv = server.ReceiveFrom(data, ref Remote);

Console.WriteLine("Message received from {0}:", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

while (true)
{
input = Console.ReadLine();
if (input == "exit")
break;
server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
data = new byte[1024];
recv = server.ReceiveFrom(data, ref Remote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();


}
Console.WriteLine("Stopping client");
server.Close();
}
}


出错行在
int recv = server.ReceiveFrom(data, ref Remote);
上面一段我自己加了个try_catch

查帖子说是可能是接收端是不是已经关闭了,或者接收端并没有打开某个端口来接收发送端发来的数据

想请教一下,究竟该如何处理这样的问题
...全文
999 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluewaterz 2014-05-06
  • 打赏
  • 举报
回复
LZ,怎么解决的?碰到同样的问题了,求助
candy61818 2012-07-09
  • 打赏
  • 举报
回复
自收自发的接收端口没有绑定???不是用server.Bind(endPoint)绑定了吗?
candy61818 2012-07-09
  • 打赏
  • 举报
回复
自收自发的接收端口没有绑定???不是用 server.Bind(endPoint)绑定了吗?
candy61818 2012-07-09
  • 打赏
  • 举报
回复
自收自发的接收端口没有绑定???不是用 server.Bind(endPoint)绑定了吗?
Kenall 2011-09-19
  • 打赏
  • 举报
回复
找到原因了,自收自发的接收端口没有绑定,原程序要重新处理下,绑定了端口可以调试出来了,感谢
ghost5216 2011-09-19
  • 打赏
  • 举报
回复
sendto
9050 是远端端口

bind是本地端口
Kenall 2011-09-19
  • 打赏
  • 举报
回复
用NETSTAT命令查看打开的端口,发现用sendto指令发送数据的本机端口9050并没有打开,是否就是这个因素?
Kenall 2011-09-19
  • 打赏
  • 举报
回复
我把绑定放置在定义server后面,上述报参数无效的错误没了,不过还是出现“远程主机强迫关闭了一个现有的连接”的错误
Kenall 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ghost5216 的回复:]
server应该先绑定一个本地的端口

IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);

server.Bind(endPoint);
[/Quote]
加入代码后,提示server.Bind(endPoint);出错

出错信息,
System.Net.Sockets.SocketException: 提供了一个无效的参数。
在 System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress
socketAddress)
在 System.Net.Sockets.Socket.Bind(EndPoint localEP)
在 SimpleUdpClient.Main() 位置 D:\Documents and Settings\Administrator\桌面\U
DP通讯\test1\test1\Program.cs:行号 39
ghost5216 2011-09-19
  • 打赏
  • 举报
回复
server应该先绑定一个本地的端口

IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);

server.Bind(endPoint);

Kenall 2011-09-19
  • 打赏
  • 举报
回复
附带说明,之前遇到过端口被windows防火墙挡住的问题,为了调试,我已经将防火墙都关闭了

111,129

社区成员

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

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

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