★★★急死人了,大家帮帮我吧!解决后立即给分!!★★★
我做了一个MDI程序,Form1是主窗体,Form2,Form3...是子窗体,为了实现"远程处理",并且侦听特定端口,我在Form2的Load事件中分别开了两个线程,代码如下:
private void Form2_Load(object sender, System.EventArgs e)
{
//新建一个线程用来侦听端口
listenClient=new Thread(new ThreadStart(WatchClient));
listenClient.IsBackground=true;
listenClient.Start();
//新建一个进程来注册远程对象
registerObject=new Thread(new ThreadStart(RegistryRemoteObject));
registerObject.IsBackground=true;
registerObject.Start();
}
其中:
private void RegistryRemoteObject()
{
try
{
//读取注册表中的信道号
RegistryKey regRead=Registry.LocalMachine.OpenSubKey("SoftWare\\RemoteListServer");
int chan=Convert.ToInt32(regRead.GetValue("channel"));
//注册远程对象
channel=new TcpChannel(chan);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteServices),"RemoteServices",WellKnownObjectMode.Singleton);
regRead.Close();
}
catch(Exception e)
{
MessageBox.Show("2"+e.Message);
}
}
可是在RegistryRemoteObject()中,总是报错:"通常每个套接字地址(协议/网络地址/端口)只允许使用一次",而我在新建的单独的另一个程序中再调试RegistryRemoteObject时,却没错误,由此推断出,问题应该出在RegistryRemoteObject所在的线程中,但是我只看到在书上注册远程组件和侦听端口都是在Main函数中进行,而我必须在Form2中"注册对象"和"侦听断口",却又出现错误,大家帮帮我啦!
$$$$$$$$$$$$$$$$$$$$$$$$$
问题点数:100、回复次数:14Top
1 楼wen2425(ZJNU(思进))回复于 2004-05-04 21:14:19 得分 0
$Top
2 楼hivak47(比尔)回复于 2004-05-04 21:20:59 得分 0
添加一个for语句行吗?Top
3 楼HNU(嶽麓書院,惟楚有材,於我為盛!)回复于 2004-05-04 23:04:00 得分 0
up ~Top
4 楼gglovecs(lovecsdn)回复于 2004-05-05 09:08:46 得分 0
要不在每个线程启动时加入判断:地址是否被使用Top
5 楼turnmissile(会翻跟头的导弹)回复于 2004-05-05 16:35:42 得分 0
把通道的端口号设为0,让他自动分配,看看能不能行!
//Connecting to Server
if(_channel == null)
{
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
// creating the IDictionary to set the port on the channel instance.
IDictionary props = new Hashtable();
// Create a channel at port number
props["port"] = 0;
// pass the props for the port setting and the server provider in the
// server chain argument. (Client remains null here.)
this._channel = new TcpChannel(props, null, provider);
}
try
{
// Register the channel
ChannelServices.RegisterChannel(_channel);
}Top
6 楼junes8250(嬴)回复于 2004-05-05 19:50:39 得分 0
我发现错误出现在这里
//用来接受字符的缓冲区
byte[] bytes=new byte[1024];
//得到本地终结点
IPEndPoint localEndPoint=GetLocalIPEndPoint();
//定义套接字类型
Socket listener=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//绑定
try
{
//调用Bind方法将套接字(listener)与本地终结点"关联"**********************出错了
listener.Bind(localEndPoint);
*****就是这个listener.Bind(localEndPoint)老是报错!其中localEndPoint的端口是1024,
怎么办啊?
Top
7 楼istring()回复于 2004-05-05 19:57:24 得分 0
注册远程对象不需要在线程里,在一般的函数里就可以,不是么?
Top
8 楼redbb(....DB & DEV....抵制日货,人人有责...)回复于 2004-05-05 21:11:46 得分 0
1024 ? you should select > 5000 portTop
9 楼junes8250(嬴)回复于 2004-05-05 21:34:19 得分 0
为什么?Top
10 楼junes8250(嬴)回复于 2004-05-05 21:42:10 得分 0
书上都说可以在1024~65535之间任意选吗?Top
11 楼redbb(....DB & DEV....抵制日货,人人有责...)回复于 2004-05-05 21:54:52 得分 100
some System Process has occupied the port :
端口概念
在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。我们这里将要介绍的就是逻辑意义上的端口。
端口分类
逻辑意义上的端口有多种分类标准,下面将介绍两种常见的分类:
1. 按端口号分布划分
(1)知名端口(Well-Known Ports)
知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。
(2)动态端口(Dynamic Ports)
动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。
不过,动态端口也常常被病毒木马程序所利用,如冰河默认连接端口是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等等。
Top
12 楼redbb(....DB & DEV....抵制日货,人人有责...)回复于 2004-05-05 21:55:00 得分 0
2. 按协议类型划分
按协议类型划分,可以分为TCP、UDP、IP和ICMP(Internet控制消息协议)等端口。下面主要介绍TCP和UDP端口:
(1)TCP端口
TCP端口,即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括FTP服务的21端口,Telnet服务的23端口,SMTP服务的25端口,以及HTTP服务的80端口等等。
(2)UDP端口
UDP端口,即用户数据包协议端口,无需在客户端和服务器之间建立连接,安全性得不到保障。常见的有DNS服务的53端口,SNMP(简单网络管理协议)服务的161端口,QQ使用的8000和4000端口等等
查看端口
在Windows 2000/XP/Server 2003中要查看端口,可以使用Netstat命令:
依次点击“开始→运行”,键入“cmd”并回车,打开命令提示符窗口。在命令提示符状态下键入“netstat -a -n”,按下回车键后就可以看到以数字形式显示的TCP和UDP连接的端口号及状态(如图)。
小知识:Netstat命令用法
命令格式:Netstat -a -e -n -o -s
-a 表示显示所有活动的TCP连接以及计算机监听的TCP和UDP端口。
-e 表示显示以太网发送和接收的字节数、数据包数等。
-n 表示只以数字形式显示所有活动的TCP连接的地址和端口号。
-o 表示显示活动的TCP连接并包括每个连接的进程ID(PID)。
-s 表示按协议显示各种连接的统计信息,包括端口号
Top
13 楼junes8250(嬴)回复于 2004-05-06 09:43:44 得分 0
多谢redbb(....Dotneter....) ,我把端口选择为>5000后,就通过了.
同时也谢谢大家的参与!
特加分给大家!!Top
14 楼junes8250(嬴)回复于 2004-05-06 09:47:08 得分 0
不好意思,加不了了,100分已是上限了.Top




