C# 侦听套接字只侦听一次
下面的服务器套接字代码有问题-C# 侦听套接字只侦听一次,c#,sockets,C#,Sockets,下面的服务器套接字代码有问题-Main()方法中的循环只执行一次,不接受任何进一步的输入 class Server { public Socket servSock(int Port) { Socket s1 = null; IPHostEntry ipHE = Dns.GetHostEntry("localhost"); IPAddress ipA = ipHE.AddressList[0]; IPEndPoint
Main()
方法中的循环只执行一次,不接受任何进一步的输入
class Server
{
public Socket servSock(int Port)
{
Socket s1 = null;
IPHostEntry ipHE = Dns.GetHostEntry("localhost");
IPAddress ipA = ipHE.AddressList[0];
IPEndPoint ipEp = new IPEndPoint(ipA, Port);
s1 = new Socket(ipEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
s1.Bind(ipEp);
return s1;
}
const int BUFFSIZE = 1024;
const int BACKLOG = 255;
static void Main(string[] args)
{
Nwork nwork = new Nwork();
Socket cl = null;
Socket s = nwork.servSock(400);
s.Listen(BACKLOG);
byte[] rcvBuffer = new byte[BUFFSIZE];
for (; ; )
{
string text = "";
Console.Clear();
cl = s.Accept();
Console.Write("Handling Client >> " + cl.RemoteEndPoint +"\n\n\n");
cl.Receive(rcvBuffer, BUFFSIZE, SocketFlags.None);
text = Encoding.ASCII.GetString(rcvBuffer, 0, BUFFSIZE).TrimEnd('\0');
Console.Write(text);
cl.Close();
}
}
}
如果不深入研究代码,我会尝试在for循环中添加s.Listen(BACKLOG)。
请注意,通过这种方式,您只能同时处理i套接字连接,如果其他人要尝试打开套接字连接,您的进程将忙于接收来自以前连接的数据。
这取决于您的场景,但您可能希望异步实现它。
如果您决定这样做,可能会有用。我不知道“Nwork”是什么,但我怀疑这是您的bug的来源。手动初始化套接字对我来说很有效,并允许后续连接
static void Main(string[] args)
{
Socket s = new Socket(SocketType.Stream, ProtocolType.TCP);
Socket cl = null;
System.Net.IPEndPoint endpoint = new System.Net.IPEndPoint(0, 400); // listen on all adapters on port 400
s.Bind(endpoint);
s.Listen(BACKLOG);
byte[] rcvBuffer = new byte[BUFFSIZE];
for (; ; )
{
string text = "";
Console.Clear();
cl = s.Accept();
Console.Write("Handling Client >> " + cl.RemoteEndPoint + "\n\n\n");
cl.Receive(rcvBuffer, BUFFSIZE, SocketFlags.None);
text = Encoding.ASCII.GetString(rcvBuffer, 0, BUFFSIZE).TrimEnd('\0');
Console.Write(text);
cl.Close();
}
}
如果添加s.Listen(BACKLOG),问题仍然存在
Listen
仅将套接字标记为侦听套接字,并设置传入连接队列大小,并且只应调用一次。是否Nwork.servSock
与Server.servSock
相同?你确定只想将服务器套接字绑定到本地主机吗?嗯,如果我不使用nwork类进行绑定,那么问题可能会消失,但我仍然无法解决问题。谢谢大家