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

时间:2016-08-16 19:02:10

标签: c# c++ sockets server

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

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

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

0 个答案:

没有答案