5

我创建了一个多线程客户端-服务器聊天应用程序,并想用多个客户端测试我的应用程序。我打算在客户端创建一个模拟器,它创建一个随机端口和 IP。我的意思是我的客户端系统应该运行多个端口(不运行多次)。

我试图找出在客户端类中提供客户端 IP 和端口号的代码部分,但无法弄清楚。我只找到了提供服务器 IP 和端口的部分。

这是我的连接建立部分

private void cmdConnect_Click(object sender, System.EventArgs e)
    {
        try
        {
            //create a new client socket ...
            m_socWorker = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            String szIPSelected  = txtIPAddress.Text;
            String szPort = txtPort.Text;
            int  alPort = System.Convert.ToInt16 (szPort,10);


            System.Net.IPAddress    remoteIPAddress  = System.Net.IPAddress.Parse(szIPSelected);
            System.Net.IPEndPoint   remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, alPort);
            m_socWorker.Connect(remoteEndPoint);
        }
        catch (System.Net.Sockets.SocketException se)
        {
            MessageBox.Show ( se.Message );
        }
    }

和我的数据发送部分

private void cmdSendData_Click(object sender, System.EventArgs e)
    {
        try
        {
            Object objData = txtData.Text;
            byte[] byData = System.Text.Encoding.ASCII.GetBytes(objData.ToString ());
            m_socWorker.Send (byData);
        }
        catch(System.Net.Sockets.SocketException se)
        {
            MessageBox.Show (se.Message );
        }
    }
4

1 回答 1

6

如果您确实需要在与服务器建立连接之前设置客户端套接字地址,并且当您想要强制内核绑定到多宿主系统上的特定本地地址时通常是一个有效的场景,您可以在调用Socket.Bind() 之前调用Socket.Connect()

IPAddress  localIPAddress = IPAddress.Parse(szLocalIP);
IPEndPoint localEndPoint  = new IPEndPoint(localIPAddress, 0);
m_socWorker.Bind(localEndPoint);

m_socWorker.Connect(remoteEndPoint);

您也可以在IPEndPoint构造函数中显式指定本地端口号,但您必须确保该端口未在使用中。如果您将端口号保留为 0,则系统将选择(几乎)任意空闲端口号。

请注意,您不能只选择任意客户端 IP 地址 - 它必须是在系统启用的网络接口上配置的地址之一。查看ipconfig /all配置的输出。如果您只是想测试,您可以为一个接口分配多个 IP 地址。

于 2012-12-17T13:23:31.540 回答