C# 获取套接字服务器以侦听外部连接

C# 获取套接字服务器以侦听外部连接,c#,c++,sockets,server,C#,C++,Sockets,Server,我想知道我如何管理我的套接字服务器,它监听端口3333和任何传入的IP地址,可以监听外部连接。在我的本地网络上,一切正常,但如果人们试图从另一个无法连接的路由器连接到服务器,我已经在防火墙中为我的server.exe添加了一个例外,并打开了路由器上的3333端口。我还有别的事要做吗? 谢谢你的帮助 编辑: 服务器代码(C#): private static Socket serverSocket=新套接字(AddressFamily.InterNetwork,SocketType.Stream,

我想知道我如何管理我的套接字服务器,它监听端口3333和任何传入的IP地址,可以监听外部连接。在我的本地网络上,一切正常,但如果人们试图从另一个无法连接的路由器连接到服务器,我已经在防火墙中为我的server.exe添加了一个例外,并打开了路由器上的3333端口。我还有别的事要做吗? 谢谢你的帮助

编辑: 服务器代码(C#):

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();
}