【问题标题】:C# Socket Programming: how to identify client by name not by IPC# Socket 编程:如何通过名称而不是 IP 来识别客户端
【发布时间】:2017-06-19 07:27:23
【问题描述】:

我是套接字编程的新手。我正在开发一个客户端-服务器通信程序,当客户端连接到服务器时,无法显示客户端名称而不是 IP 地址。任何人都可以建议我一个好的方法吗?我怎么能这样做?我也需要该 IP 以进行进一步的通信。 这是我的客户端代码:

mTcpClient = new TcpClient();
mTcpClient.BeginConnect(ipa, nPort, onCompleteConnect, mTcpClient);

还有那个 onCompleteConnect 函数:

void onCompleteConnect(IAsyncResult iar)
    {

        TcpClient tcpc;

        try
        {
            tcpc = (TcpClient)iar.AsyncState;
            tcpc.EndConnect(iar);
            mRx = new byte[512];
            tcpc.GetStream().BeginRead(mRx, 0, mRx.Length, onCompleteReadFromServerStream, tcpc);

        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message);
        }
    }

现在,我也想发送客户端名称并在服务器端接收。我该怎么办?

【问题讨论】:

  • 由于您在连接时已经有了名称,请使用连接语句中的字符串。一个简单的技巧是创建一个继承 TcpClient 的自定义类并添加一个名为 ClientName 的属性。或者创建一个状态对象(如在 msdn 示例中)并将客户端名称作为属性放入状态对象中。

标签: c# sockets


【解决方案1】:

Environment.UserName 属性从客户端发送到服务器。

【讨论】:

  • 谢谢,但我在程序设置中有用户名。我想在连接到服务器时将该用户名发送到服务器。服务器上的这一行给了我客户端的 IP new ClientNode(tclient, new byte[512], new byte[512], tclient.Client.RemoteEndPoint.ToString())));
  • 使用该字节缓冲区,您可以将前 4 个字节填充为标有“用户”的标头,然后填充接下来的 508 个字节以发送用户名。因为用户名很可能不会是 508 字节,所以您需要将尾随空字节添加到缓冲区,然后从客户端发送。服务器应该读取前 4 个标头字节,然后读取接下来的 508 个字节作为用户名。服务器应该删除添加到缓冲区的尾随空字节,然后您应该拥有用户名。
【解决方案2】:

使用StreamWriterStreamReader 读取字符串。

示例

客户:

StreamWriter sW = new StreamWriter(mTcpClient.GetStream());
sW.AutoFlush = true;

// Send the username
sW.WriteLine(Environment.UserName);

服务器:

StreamReader sR = new StreamReader(mTcpClient.GetStream());

// Read the username (waiting for the client to use WriteLine())
String username = sR.ReadLine();

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2015-02-24
    • 2017-09-27
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多