C#-服务器端密码保护

C#-服务器端密码保护,c#,visual-studio-2008,sockets,password-protection,C#,Visual Studio 2008,Sockets,Password Protection,我正在编写两个控制台应用程序,一个客户端和一个服务器。 我有点被两件事困住了,一开始似乎很容易 #1:我想为下面的代码段编写一个函数,将位转换为字符串,但我想不出来。当我使用它时,服务器总是崩溃。我的函数与此函数稍有不同,但这是因为我当前的代码必须包含连接信息,我认为有更好的方法可以做到这一点: byte[] b = new byte[100]; int k = s.Receive(b); string packet = null;

我正在编写两个控制台应用程序,一个客户端和一个服务器。 我有点被两件事困住了,一开始似乎很容易

#1:我想为下面的代码段编写一个函数,将位转换为字符串,但我想不出来。当我使用它时,服务器总是崩溃。我的函数与此函数稍有不同,但这是因为我当前的代码必须包含连接信息,我认为有更好的方法可以做到这一点:

        byte[] b = new byte[100];
        int k = s.Receive(b);

            string packet = null;
        for (int i = 0; i < k; i++)
        {
            Console.Write(Convert.ToChar(b[i]));
            packet = packet + Convert.ToChar(b[i]);
        }
#2我希望客户端始终只发送一次带有密码的数据包。如果密码与服务器中提到的字符串密码不匹配,则应关闭与客户端的连接

我知道如何只发送一次数据包,但我不知道如何在服务器上为每个客户端检查一次数据包


或者换句话说,目前服务器无法知道客户机是否已经过身份验证。因此,我猜客户端需要某种套接字ID,服务器需要一个带有ID的表,以及一个布尔值,以查看它是否经过自动验证。

第一部分,将字节转换为字符串。。。那么:

byte b[] = new byte[100];
int k = s.Receive(b, b.Length, 0);

string packet = Encoding.ASCII.getString(b, 0, k);

第二部分。。。我不太清楚。

我在上面的第1部分和第2部分都和罗布在一起。。。 假设您使用的是TCP连接,
System.Net.Sockets
类应该处理您的 需要

如果您使用
AcceptSocket
AcceptTcpClient
从传入连接请求队列中拉取连接,您将获得该连接特有的套接字或tcpclient。只要让它开着,直到你用完为止。(如果您的服务还有其他事情要做,也有非阻塞替代方案…)


如果客户端关闭或打开新连接,则必须以某种方式重新验证。(这可能是在他们第一次进行身份验证时,您为他们生成了一个令牌,这是您使用UDP连接时的唯一选择)。

谢谢,这比我现在使用的要快得多!好的,谢谢。我来看看。如果有某种形式的run_once命令,这将非常容易。然后我会在我的mysql表中放一个布尔值,告诉他们是否安全登录。这完全取决于如何访问您的服务。如果所有的事务都将在短时间内(几分钟)完成,那么使用TCP是一种可行的方法,因为它将为您处理身份验证的记忆。(相同的连接=仍然经过身份验证)。但是,如果间隔超过5分钟,TCP会话将超时,因此您需要使用令牌方法。
byte b[] = new byte[100];
int k = s.Receive(b, b.Length, 0);

string packet = Encoding.ASCII.getString(b, 0, k);