如何使用.net套接字重用TCP端点地址
本文关键字:TCP 端点 地址 何使用 net 套接字 | 更新日期: 2023-09-27 18:02:23
我有一些客户端-服务器套接字代码,我希望能够构建并(重新)定期连接到相同的端点地址:localhost:17999
服务器:
// Listen for a connection:
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Loopback, 17999);
Socket listener = new Socket(IPAddress.Loopback.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
listener.Bind(localEndPoint);
listener.Listen(1);
// Accept the connection and send a message:
Socket handler = listener.Accept();
byte[] bytes = new byte[1024];
bytes = Encoding.ASCII.GetBytes("The Message...");
handler.Send(bytes);
// Clean up
handler.Shutdown(SocketShutdown.Both);
handler.Close();
handler.Dispose();
listener.Shutdown(SocketShutdown.Both);
listener.Close();
listener.Dispose();
客户端:
byte[] bytes = new byte[1024];
Socket receiver = new Socket(IPAddress.Loopback.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
receiver.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
receiver.Connect(new IPEndPoint(IPAddress.Loopback, 17999));
int num_bytes_received = receiver.Receive(bytes);
string result = Encoding.ASCII.GetString(bytes, 0, num_bytes_received);
receiver.Shutdown(SocketShutdown.Both);
receiver.Close();
receiver.Dispose();
当我第一次创建客户机和服务器时,它工作得很好。然而,当我再次创建它时,我得到一个错误:
"发送或接收数据的请求被拒绝,因为套接字是未连接和(在使用sendto发送数据报套接字时)呼叫)没有提供地址"
我希望能够在需要时任意启动此机制,并使用以下事件顺序:
- 启动服务器并等待接受连接
- 启动客户端并连接到服务器
- 在服务器端接受客户端连接
- 向客户端发送消息
- 必要时重复
我该怎么做?
提前感谢!
EDIT:每次我构建客户机和服务器对象时,它都来自不同的进程。
有两个问题:
1)你正在关闭监听器。让它开着。
2)你把ReuseAddress
设置在错误的插座上,而且太晚了。在调用bind
之前将其设置在侦听套接字上(因为这是您使用地址的时候)。
设置ReuseAddress
在套接字你不去bind
不做任何事情。您可以从客户端删除它
我尝试了Gene的建议,它似乎有效:
// Listen for a connection:
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Loopback, 17999);
using (Socket listener = new Socket(IPAddress.Loopback.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
{
listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
listener.Bind(localEndPoint);
listener.Listen(1);
Thread t = new Thread(() =>
{
// Accept the connection and send a message:
using (Socket handler = listener.Accept())
{
byte[] bytes = new byte[1024];
bytes = Encoding.ASCII.GetBytes("The Message...");
handler.Send(bytes);
}
});
t.Start();
t.Join();
}
谢谢!