您的位置:程序门 -> .net技术 -> c#



socket.connect在什么时候会报“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”的异常?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


socket.connect在什么时候会报“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”的异常?[已结贴,结贴人:panxin]
发表于:2007-02-27 18:02:29 楼主
如题
发表于:2007-02-28 10:36:261楼 得分:0
多半都是端口重复打开
发表于:2007-02-28 10:38:262楼 得分:0
进程里关闭正在运行的窗体~
发表于:2007-02-28 10:41:493楼 得分:0
to   csshooter:
进行连接的端口是由系统分配的啊,已经被占用的就不应该分配了吧
发表于:2007-02-28 10:47:084楼 得分:0
关闭进程,同一端口不可以同时使用。
发表于:2007-02-28 14:08:305楼 得分:0
关闭进程,同一端口不可以同时使用。
=======================================
不能关闭进程,程序执行时不间断的向10个目标端口发送数据,发送数据的过程为:
1   创建到目标端口的连接(socket.connect)
2   发送数据(socket.send)
3   等待接收数据,超时时间为1秒(socket.recive)
4   关闭连接(socket.close)

发送数据的工作是多线程同时进行,每个目标端口对应的发送线程数量是3个,
那么10个目标端口就是30个发送线程。

发表于:2007-03-01 00:51:446楼 得分:0
1     你用问端口没关闭
2     该端口在用了
发表于:2007-03-01 08:14:567楼 得分:0
不能关闭进程,程序执行时不间断的向10个目标端口发送数据,发送数据的过程为:
1   创建到目标端口的连接(socket.connect)
2   发送数据(socket.send)
3   等待接收数据,超时时间为1秒(socket.recive)
4   关闭连接(socket.close)


把打开关闭端口放到线程外面去,线程只管发送,不管打开关闭端口,这样就不会造成冲突了,不过你多线程同时发送要注意接收端能不能正确分离。
发表于:2007-03-01 09:57:268楼 得分:0
把打开关闭端口放到线程外面去,线程只管发送,不管打开关闭端口,这样就不会造成冲突了,不过你多线程同时发送要注意接收端能不能正确分离。
========================================================

更详细的过程应该是:
1   准备要发送的数据(5000条),放入队列(queue <string> )
2   为每个目标端口创建3个发送线程
3   每个发送线程检查队列中是否有数据需要发送,如果有,则创建到目标端口
    的连接,发送数据,接收数据(超时为1秒),最后关闭连接。
4   队列中没有数据,则发送线程退出。

这样的操作流程没有办法把端口的打开和关闭操作放到线程外面去做。

另外,连接的创建和关闭代码如下:
socket   socket   =   null;
try
{
        //创建连接
}
catch(exception   ex)
{
        //输出异常
}
finally
{
        if   (socket!=null)
        {
                try
                {
                        //关闭连接
                }
                catch(exception   exx)
                {
                        //输出异常
                }
        }
}

程序运行阶段没有在关闭连接处发生过异常,所以应该可以确定每次连接的关闭都是成功的。
发表于:2007-03-01 09:59:149楼 得分:0
我不明白的是,socket.connect时所用到的本地端口号是系统分配的,它应该分配给我的是当前没有被使用的吧,如果是这样,就不应该出现“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”的异常吧。
发表于:2007-03-01 13:39:3810楼 得分:20
to   它应该分配给我的是当前没有被使用的吧

没错,但是系统分配的是你用于连接的port,而不是你要连接的port。也就是说你要连接192.168.56.6:6666这个地址吧,那么192.168.56.6这台机器的6666端口被占用了,所以报错了,而你用于连接192.168.56.6:6666的本机端口是系统指定的。
发表于:2007-03-01 17:08:1511楼 得分:0
没错,但是系统分配的是你用于连接的port,而不是你要连接的port。也就是说你要连接192.168.56.6:6666这个地址吧,那么192.168.56.6这台机器的6666端口被占用了,所以报错了,而你用于连接192.168.56.6:6666的本机端口是系统指定的。

==============================================

但是目标端口是有监听队列长度的啊,我设置的是1000。
那么按照你的意思,也就是说目标端口的监听队列已满,所以才会报这个错误,是吗?
发表于:2007-03-02 10:29:2012楼 得分:0
比如你的本機端口90被佔用了,然後你又使用90這個端口時,就會報這個錯誤


快速检索

最新资讯
热门点击