C# 获取套接字服务器以侦听外部连接
我想知道我如何管理我的套接字服务器,它监听端口3333和任何传入的IP地址,可以监听外部连接。在我的本地网络上,一切正常,但如果人们试图从另一个无法连接的路由器连接到服务器,我已经在防火墙中为我的server.exe添加了一个例外,并打开了路由器上的3333端口。我还有别的事要做吗? 谢谢你的帮助 编辑: 服务器代码(C#):C# 获取套接字服务器以侦听外部连接,c#,c++,sockets,server,C#,C++,Sockets,Server,我想知道我如何管理我的套接字服务器,它监听端口3333和任何传入的IP地址,可以监听外部连接。在我的本地网络上,一切正常,但如果人们试图从另一个无法连接的路由器连接到服务器,我已经在防火墙中为我的server.exe添加了一个例外,并打开了路由器上的3333端口。我还有别的事要做吗? 谢谢你的帮助 编辑: 服务器代码(C#): private static Socket serverSocket=新套接字(AddressFamily.InterNetwork,SocketType.Stream,
private static Socket serverSocket=新套接字(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
private static List clientSockets=new List();
专用const int PORT=3333;
专用静态字节[]缓冲区=新字节[100];
私有静态随机=新随机();
私有静态int-connectedClients=0;
私有void ReceiveCallback(IAsyncResult AR)
{
插座电流=(插座)AR.AsyncState;
收到整数;
尝试
{
已接收=当前的EndReceive(AR);
}
捕获(SocketException)
{
Console.WriteLine(“客户端”+已连接客户端+“已断开连接!(强制)”);
current.Close();
clientSockets.移除(当前);
返回;
}
字节[]recBuf=新字节[100];
复制(缓冲区、recBuf、接收);
stringtext=getText(Encoding.ASCII.GetString(recBuf));
如果(文本!=“”)
{
Console.WriteLine(“接收:+文本”);
}
如果(当前连接)
当前.BeginReceive(缓冲区,0,100,SocketFlags.None,ReceiveCallback,当前);
}
私有void AcceptCallback(IAsyncResult AR)
{
插座;
尝试
{
socket=serverSocket.EndAccept(AR);
}
捕获(ObjectDisposedException)
{
返回;
}
clientSockets.Add(socket);
socket.BeginReceive(缓冲区,0,100,SocketFlags.None,ReceiveCallback,套接字);
ConnectedClient++;
Console.WriteLine(“客户端”+connectedClients+”已连接![“+IPAddress.Parse(((IPEndPoint)socket.RemoteEndPoint).Address.ToString())+”:“+
((IPEndPoint)socket.RemoteEndPoint.Port.ToString()+“]”);
serverSocket.BeginAccept(AcceptCallback,null);
}
私有void setupServer()
{
SocketPermission perm=新的SocketPermission(NetworkAccess.Accept,TransportType.Tcp,“/*这里是我的IPv4*/,端口);
perm.Assert();
绑定(新的IPEndPoint(IPAddress.Any,PORT));
serverSocket.Listen(10);//0
WriteLine(“服务器已启动!”);
Console.WriteLine(“监听客户…”);
serverSocket.BeginAccept(AcceptCallback,null);
}
私有void CloseAllSockets()
{
foreach(客户端套接字中的套接字)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
serverSocket.Close();
}
静态void Main(字符串[]参数)
{
Console.Title=“服务器”;
Console.BackgroundColor=ConsoleColor.Black;
Console.ForegroundColor=ConsoleColor.Green;
程序prgrm=新程序();
prgrm.setupServer();
Console.ReadLine();
prgrm.CloseAllSockets();
}
您有静态IP地址吗?@Sergey.quixoticaxis.Ivanov它是静态的,我在没有VPN的PC上运行服务器,让客户端连接到我的IPV4,然后添加一些代码(如果可能)。它应该使用开放端口。@Sergey.quixoticaxis.Ivanov更新的OP@Sergey.quixoticaxis.Ivanov好的,谢谢你的帮助tho:)你有一个静态IP地址吗?@Sergey.quixoticaxis.Ivanov它是静态的,我在我的PC上运行服务器,没有VPN,我让客户端连接到我的IPV4,然后添加一些代码(如果可能)。它应该使用开放端口。@Sergey.quixoticaxis.Ivanov更新的OP@谢尔盖·吉诃德·伊万诺夫好的谢谢你的帮助tho:)
private static Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static List<Socket> clientSockets = new List<Socket>();
private const int PORT = 3333;
private static byte[] buffer = new byte[100];
private static Random random = new Random();
private static int connectedClients = 0;
private void ReceiveCallback(IAsyncResult AR)
{
Socket current = (Socket)AR.AsyncState;
int received;
try
{
received = current.EndReceive(AR);
}
catch (SocketException)
{
Console.WriteLine("Client " + connectedClients + " Disconnected! (Forced)");
current.Close();
clientSockets.Remove(current);
return;
}
byte[] recBuf = new byte[100];
Array.Copy(buffer, recBuf, received);
string text = getText(Encoding.ASCII.GetString(recBuf));
if (text != "")
{
Console.WriteLine("Recieved: " + text);
}
if (current.Connected)
current.BeginReceive(buffer, 0, 100, SocketFlags.None, ReceiveCallback, current);
}
private void AcceptCallback(IAsyncResult AR)
{
Socket socket;
try
{
socket = serverSocket.EndAccept(AR);
}
catch (ObjectDisposedException)
{
return;
}
clientSockets.Add(socket);
socket.BeginReceive(buffer, 0, 100, SocketFlags.None, ReceiveCallback, socket);
connectedClients++;
Console.WriteLine("Client " + connectedClients + " Connected! [" + IPAddress.Parse(((IPEndPoint)socket.RemoteEndPoint).Address.ToString()) + "::" +
((IPEndPoint)socket.RemoteEndPoint).Port.ToString() + "]");
serverSocket.BeginAccept(AcceptCallback, null);
}
private void setupServer()
{
SocketPermission perm = new SocketPermission(NetworkAccess.Accept, TransportType.Tcp, ""/*Here would sit my IPv4*/, PORT);
perm.Assert();
serverSocket.Bind(new IPEndPoint(IPAddress.Any, PORT));
serverSocket.Listen(10);//0
Console.WriteLine("Server Started!");
Console.WriteLine("Listening for Clients...");
serverSocket.BeginAccept(AcceptCallback, null);
}
private void CloseAllSockets()
{
foreach (Socket socket in clientSockets)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
serverSocket.Close();
}
static void Main(string[] args)
{
Console.Title = "Server";
Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.Green;
Program prgrm = new Program();
prgrm.setupServer();
Console.ReadLine();
prgrm.CloseAllSockets();
}