通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 202.104.236.110:80

医手 2008-09-05 03:39:47

public partial class frmMain : Form
{
private string hostname = "\u0077\u0077\u0077\u002e\u0068\u0061\u006f\u006c\u0069\u0061\u006f\u007a\u0069\u002e\u0063\u006f\u006d";
private int port = 80;
private Encoding en = Encoding.GetEncoding("GB2312");
private string page = "/test/MySocket.asp";
private string templete =
@"GET {0} HTTP/1.1
Host:{1}
Connection:close
User-agent:Mozilla/4.0
Accept-language:zh-cn

";
//private IPEndPoint localPoint = null;//本地端点
//private IPEndPoint remotePoint = null;//远程端点

public frmMain()
{
InitializeComponent();
}

private void btnConnection_Click(object sender, EventArgs e)
{
btnConnection.Enabled = false;
Connection(hostname,port, page);
GC.Collect();
btnConnection.Enabled = true;
}

private void Connection(string hostname, int port, string page)
{
IPEndPoint localPoint = null;//本地端点
IPEndPoint remotePoint = null;//远程端点
IPAddress localAddress = Dns.GetHostAddresses(Dns.GetHostName())[0];
localPoint = new IPEndPoint(localAddress, IPEndPoint.MinPort);
IPAddress remoteAddress = Dns.GetHostAddresses(hostname)[0];
remotePoint = new IPEndPoint(remoteAddress, port);
TcpClient tc = new TcpClient();
string content = string.Format(templete, page, hostname);

//设置本地端点
if (localPoint.Port == IPEndPoint.MinPort)
{
while (true)
{
localPoint.Port++;
try
{
tc.Client.Bind(localPoint);
break;
}
catch
{
}
}
}
else
{
try
{
tc.Client.Bind(localPoint);
}
catch (Exception ex)
{
txtTarget.Text = "[端口] " + ex.Message;
return;
}
}
this.Text = localPoint.ToString();
//连接
try
{
tc.Connect(remotePoint);
}
catch (Exception ex) //有时会报这个错: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
{
txtTarget.Text = "[连接] " + ex.Message;
return;
}

NetworkStream stream = null;
try
{
stream = tc.GetStream();
}
catch (Exception ex)
{
txtTarget.Text = "[流] " + ex.Message;
tc.Close();
return;
}
try
{
//写
byte[] data = en.GetBytes(content);
stream.Write(data, 0, data.Length);
}
catch (Exception ex)
{
txtTarget.Text = "[写] " + ex.Message;
}
try
{
//读
byte[] data2 = new byte[1024];
stream.Read(data2, 0, 1024);
string result = en.GetString(data2);
txtTarget.Text = result;
}
catch (Exception ex)
{
txtTarget.Text = "[读]" + ex.Message;
}
//关闭
stream.Close();
tc.Client.Close();
tc.Close();
}

private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
}
}

多点几次btnConnection就会报错了:
通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 202.104.236.110:80

有不少人问过这样的问题了,不过我的情况不太一样。
这里报错的是远程的端口....
我把该关的都关了,并且强制回收了垃圾....
...全文
9279 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglei451 2010-12-28
  • 打赏
  • 举报
回复
顶 最后怎么解决的?
mazan604 2009-08-29
  • 打赏
  • 举报
回复
private int port = 80;
把80这个端口换成别的端口,每运行一次程序,都要换一个没用过的端口,因为,再上一次运行的时候,端口已经被绑定占用了
mymogal 2009-04-23
  • 打赏
  • 举报
回复
刚好遇到这个问题不知怎么办
kellynic 2008-12-22
  • 打赏
  • 举报
回复
很简单,不要调用关闭流、连接就什么事也没了。。

stream.Close();
tc.Client.Close();
tc.Close();


医手 2008-09-10
  • 打赏
  • 举报
回复
沉底了....
staronline 2008-09-07
  • 打赏
  • 举报
回复

先 Shutdown(SocketShutdown.Both) 一下看看可以不
wangkuang5 2008-09-07
  • 打赏
  • 举报
回复
  
/// <summary>
/// UDP检查端口绑定
/// </summary>
/// <param name="localip"></param>
/// <param name="port"></param>
/// <returns></returns>
public static bool IsBindEndPoint(System.Net.IPAddress localip,int port)
{
System.Net.IPEndPoint ipe = new System.Net.IPEndPoint(localip, port);
System.Net.Sockets.Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);

try
{
s.Bind(ipe);
return false;
}
catch (System.Net.Sockets.SocketException ex)
{
if (ex.SocketErrorCode == System.Net.Sockets.SocketError.AddressAlreadyInUse)
{
return true;
}
else
{
return false;
}
}
finally
{
s.Close();
s = null;
}
}

/// <summary>
/// 判断是否合法IP /// </summary>
/// <param name="strIP"></param>
/// <returns></returns>
public static bool ValidateIPAddress(string strIP)
{
//if (null == strIP || "" == strIP.Trim() || Convert.IsDBNull(strIP))
if (string.IsNullOrEmpty(strIP.Trim()) || Convert.IsDBNull(strIP))
{ return false; }

return System.Text.RegularExpressions.Regex.IsMatch(strIP, @"^((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$");
}


希望这段对你有帮助
我的程序是要求启动主窗口时就检查绑定
wangkuang5 2008-09-07
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Management;

using LanServer.Utilities;

namespace LanServer
{
public partial class FormNetStart : Form
{
public FormNetStart()
{
InitializeComponent();
}


System.Net.IPAddress[] HostIPAddress;

private System.Net.IPAddress ipsetted;

public System.Net.IPAddress StartIP
{
get { return ipsetted; }
set { ipsetted = value; }
}
private int portsetted;

public int StartPort
{
get { return portsetted; }
set { portsetted = value; }
}
private void FormNetStart_Load(object sender, EventArgs e)
{
//HostIPAddress= Utilities.Utilities. LocalHostIPAddress;
//string[] ali = Utilities.Utilities.Aliases;
//for (int i = 0; i < HostIPAddress.Length; i++)
//{
// // 显示当前ip;
// this.cdIPAddressList.Items.Add(HostIPAddress[i].ToString());
//}

//SELECT * FROM Win32_NetworkAdapterConfiguration")
try
{
///将本机的网卡加到列表显示Win32_NetworkAdapterConfiguration
///
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
//ArrayList strArr = new ArrayList();

//网卡数
//foreach (ManagementObject mo in moc)
//{
// if ((bool)mo["IPEnabled"])
// {
// //cdIPAddressList.Items.Add(mo["Caption"].ToString().Substring(10));
// //cdIPAddressList.Items.Add(mo["MacAddress"].ToString());

// string[] iplist = mo["IPAddress"] as string[];
// cdIPAddressList.Items.AddRange(iplist);
// }
// mo.Dispose();

//}
List<string> iplist = new List<string>();
List<string> caplist = new List<string>();

foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"])
{
//cdIPAddressList.Items.Add(mo["Caption"].ToString().Substring(10));
//cdIPAddressList.Items.Add(mo["MacAddress"].ToString());

caplist.Add(mo["Caption"].ToString().Substring(10));
//cdIPAddressList.Items.AddRange(iplist);
}
mo.Dispose();

}
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"])
{
//cdIPAddressList.Items.Add(mo["Caption"].ToString().Substring(10));
//cdIPAddressList.Items.Add(mo["MacAddress"].ToString());

iplist.AddRange(mo["IPAddress"] as string[]);
//cdIPAddressList.Items.AddRange(iplist);
}
mo.Dispose();

}
if (iplist.Count == caplist.Count)
{

for (int c = 0; c < caplist.Count; c++)
{
//if (caplist[c].Substring(0,4).StartsWith(" WAN ") == false)
//{//VPN网路要去掉
// cdIPAddressList.Items.Add(caplist[c] + "|" + iplist[c]);
//}
//string ipitem = caplist[c] + "|" + iplist[c];

cdIPAddressList.Items.Add(caplist[c] + "|" + iplist[c]);
}
if (cdIPAddressList.Items.Count > 0)
cdIPAddressList.SelectedIndex = 0;

}
else
{
throw new ArgumentNullException("ManagementObject", "未能获得本机网络参数,请打开WMI服务");
}
}
catch (ManagementException mex)
{
LanServer.BizLogic.LogWriter.AddSystemException(mex);
}
catch (System.Security.SecurityException sex)
{

LanServer.BizLogic.LogWriter.AddSystemException(sex);
}
catch (Exception ex) {
LanServer.BizLogic.LogWriter.AddSystemException(ex);
}



}

private void btnStart_Click(object sender, EventArgs e)
{
if (cdIPAddressList.SelectedItem == null)
{
return;
}
//else
//{|| Utilities.Utilities.ValidateIPAddress(cdIPAddressList.Text) == false
// ipsetted = HostIPAddress[cdIPAddressList.SelectedIndex];
//}
if (string.IsNullOrEmpty(this.nudPort.Text))
{
return;
}
if (nudPort.Value < 1023 || nudPort.Value > 65535)
{
//MessageBox.Show(nudPort.Value.ToString());
nudPort.Value = 9051;
return;
}

//MessageBox.Show(cdIPAddressList.SelectedItem.ToString().Split ('|')[1]);

//ipsetted = HostIPAddress[cdIPAddressList.SelectedIndex];
ipsetted = System.Net.IPAddress.Parse(cdIPAddressList.SelectedItem.ToString().Split('|')[1]);
portsetted = (int)nudPort.Value;


//检查端口占用


if (Utilities.Utilities.IsBindEndPoint(ipsetted, portsetted) == true)
{
System.Windows.Forms.MessageBox.Show("监听端口已被其他程序占用,不能正确获得在线播放器信息,请修改程序设置?",
"UDP端口占用错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
return;

}

btnStart.DialogResult = DialogResult.OK;
this.DialogResult = btnStart.DialogResult;
}
}
}
wuyi8808 2008-09-07
  • 打赏
  • 举报
回复
up
jietuan 2008-09-05
  • 打赏
  • 举报
回复
晚上仔细看看你的代码
homejiji 2008-09-05
  • 打赏
  • 举报
回复
。。。。你这个。。。程序好乱。。
首先 GC.Collect();这个没有用。。。
如果程序运行到Read或者Write的时候程序都会等待的
都无法直接关闭的
而且请原谅我笨,我真看不懂你的程序。。。
nullpassword 2008-09-05
  • 打赏
  • 举报
回复
Mark~
dabaicai 2008-09-05
  • 打赏
  • 举报
回复
顶,想知道结果
LovingAlison 2008-09-05
  • 打赏
  • 举报
回复
帮你顶
yagebu1983 2008-09-05
  • 打赏
  • 举报
回复
晚上好好研究一下!!
课程简介:Re:《 Linux 网络管理命令 》  ---------------------------------------内容提要: 01/22)命令 ifconfig:配置或显示网络接口信息02/22)命令 ifup:激活网络接口03/22)命令 ifdown:禁用网络接口04/22)命令 route:显示或管理路由表05/22)命令 arp:管理系统的arp缓存06/22)命令 ip:网络配置工具07/22)命令 netstat:查看网络状态08/22)命令 ss:查看网络状态09/22)命令 ping:测试主机之间网络的连通性10/22)命令 traceroute:追踪数据转发路由状况11/22)命令 arping:发送arp请求12/22)命令 telnet:远程登录主机13/22)命令 nc:多功能网络工具14/22)命令 ssh:协议详解15/22)命令 wget:命令行下载工具16/22)命令 mailq:显示邮件传输队列17/22)命令 mail:发送和接收邮件18/22)命令 nslookup:域名查询工具19/22)命令 dig:域名查询工具20/22)命令 host :域名查询工具21/22)命令 nmap:网络探测工具和安全/端口扫描器22/22)命令 tcpdump:监听网络流量            本人在教学和实战过程中发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作中,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。       对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。       研磨每一个命令就是擦拭手中的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手中的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功!       本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题中来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。       本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学中就不再赘述!     《参透 VMware 桌面级虚拟化》    《在虚拟机中安装模版机(包括应用软件等)》    《SecureCRT 连接 GNS3/Linux 的安全精密工具》  

110,534

社区成员

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

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

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