2010-09-27 6 views
0

J'écris deux applications de console, un client et un serveur. Je suis un peu coincé à deux choses, ce qui semblait assez facile d'abord ..C# - Protection par mot de passe côté serveur

# 1: Je veux écrire une fonction pour le morceau de code suivant, qui convertit bits à une chaîne, mais je ne peux pas Il suffit de le comprendre. Le serveur plante toujours lorsque je l'utilise. Ma fonction est un peu différent de celui-ci, mais c'est parce que mon code actuel doit inclure les informations de connexion, et je pense qu'il ya une meilleure façon de le faire:

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

Je suppose que la fonction est pas le problème , mais comment je l'utilise est. Toute aide serait très appréciée.

Edit: J'appelle et l'utiliser comme ceci:

byte[] b = new byte[100]; 
    string response = BitConvert(b); 

    if (response == "Hi there") 

# 2 Je veux que le client envoie un paquet AlwAYS juste une fois, avec un mot de passe. Et si ce mot de passe ne correspond pas au mot de passe mentionné en tant que chaîne dans le serveur, il doit fermer la connexion avec le client.

Je sais comment envoyer le paquet une seule fois, mais je ne sais pas comment vérifier le paquet dans le serveur une seule fois pour chaque client. En d'autres termes, pour l'instant, le serveur n'a aucun moyen de savoir si le client a déjà été authentifié. Donc je suppose que le client a besoin d'une sorte d'ID de socket, et le serveur a besoin d'une table avec l'ID, et un booléen pour voir s'il est autentiqué ou non.

Répondre

1

La première partie, obtenir les octets dans une chaîne ... Que diriez-vous:

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

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

Partie 2 ... pas sûr du haut de ma tête.

+0

Merci, c'est beaucoup plus rapide que ce que j'utilise en ce moment! – Nick

1

Je suis avec Rob ci-dessus sur la partie 1 et comme pour la partie 2 ... En supposant que vous utilisez une connexion TCP la classe System.Net.Sockets devrait répondre à vos besoins . Si vous utilisez AcceptSocket ou AcceptTcpClient pour établir une connexion à partir de la file d'attente de demandes de connexion entrante, vous obtiendrez un socket ou un tcpclient unique à cette connexion. laissez-le simplement ouvert jusqu'à ce que vous en ayez fini avec lui. (Il existe également des alternatives non bloquantes si votre service a d'autres choses à faire ...)

Si le client le ferme ou ouvre une nouvelle connexion, il devra réauthentifier en quelque sorte. (Cela peut être en incluant un jeton que vous générez pour eux lors de leur première authentification - c'est votre seule option si vous utilisez des connexions UDP).

+0

Très bien, merci. Je vais jeter un coup d'oeil à ça. Ce serait vraiment facile s'il y avait une commande run_once quelconque. Ensuite, je voudrais juste mettre un booléen dans ma table mysql pour dire s'ils se sont connectés en toute sécurité. – Nick

+0

Tout dépend de la façon dont votre service sera accessible. Si toutes les transactions se déroulent sur une courte période (quelques minutes), l'utilisation de TCP est la solution, car elle vous permettra de vous souvenir de l'authentification. (Même connexion = toujours authentifiée). Si, toutefois, des interruptions de plus de 5 minutes se produisent, la session TCP expirera et vous devrez utiliser la méthode du jeton. – FixerMark