日期:2014-05-17  浏览次数:20739 次

C#套接字TCP侦听和发送重用问题

C#的SOCKET套接字编程时出现一个问题,请教各位大虾:

我需要完成
1.先运行服务端循环侦听数据;
2.然后运行客户端发送命令;
3.服务端接收到命令根据命令发送客户端需要的数据;
4.客户端接收到数据。
所以,我需要在本机同时运行服务端和客户端进行测试,两个都需要侦听和发送数据
我的方法是:服务端和客户端都定义了两个Socket变量如下,两个都使用TCP,并使用不同的端口(8221和8321):

private Socket m_socListener;//侦听数据
private Socket m_socSender;//发送数据
...
// 初始化侦听Socket
m_socListener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
...
// 初始化发送Socket
m_socSender = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

服务端绑定的侦听端口是8221,对应客户端的发送端口是8221
服务端绑定的发送端口是8321,对应客户端的侦听端口是8321
于是同时运行时出现错误:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
我猜想此错误可能是本机同时运行客户端和服务端才会出现端口重用的问题,请教大虾们有什么解决办法?

------最佳解决方案--------------------
服务器面向多个客户端,监听端口只能有一个,建立连接后,开线程分别管理,错误提示你重用,那就说明你在该端口上实例化了2个以上...
------其他解决方案--------------------
不知道你想实现什么效果
------其他解决方案--------------------
在服务器端 一个客户只需绑定一个sokcet handler,无需分配一个端口
------其他解决方案--------------------
引用:
在服务器端 一个客户只需绑定一个sokcet handler,无需分配一个端口

请简单介绍下代码怎么实现啊!
------其他解决方案--------------------
不用给 客服端 设端口吧
------其他解决方案--------------------
引用:
不用给 客服端 设端口吧

发送可以不用设定端口,但是侦听总要设定端口吧?

...
m_socListener.Bind(ipEndPoint);
m_socListener.Listen(4);
while(true)
{
    allDone.Reset();
    // 开始异步接收数据...
    m_socListener.BeginAccept(new AsyncCallback(AcceptDataCallback), null);
    // 停止循环等待连接结束...
    allDone.WaitOne();
}

我用以上方法侦听的
客户端也需要侦听服务端发送回来的数据,请问有什么解决办法呢?