C# Server-Konsolenanwendung

01/13/2011 20:15 BLODDYKILL#1
Hey Leut´s,
Hab mich jezt in lezter zeit mit C# beschäftigt(super Sprache wenn man sich erstmal von Autoit auf Objektorientiert umgestellt hat :))

Viele tuts gelesen und bin schließlich in meinem Zielgebiet Serverprgrammierung gelandet ;P

Aus unterschiedlichen TCP Tutorials und der mdsn libary hab ich mir jezt folgendes zusammengebastelt:
PHP Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Security;
using System.Security.Permissions;
using System.Collections;



public class 
Program
    
{
        static 
void Main(string[] args)
        {
        
Server MainServer = new Server();
        
MainServer.main();
        
Thread MainListener = new Thread(MainServer.Run);
        
MainListener.Start();
        
Thread MainRecieve = new Thread(MainServer.Recieve_Check_Main);
        
MainRecieve.Start();
        
System.Console.WriteLine("Listening on port 10000");
        
Client client = new Client("127.0.0.1"10000);
        
Thread.Sleep(2000);
        
Client clients = new Client("127.0.0.1"10000);
        
Console.Read();
        
MainServer.RWork false;
        }
    }

public class 
Server 
{
    
int received;
    
Socket[] newSocket = new Socket[999];
    
byte[] buffer;
    
string empfangen;
    public 
int SocketCounter 0;
    const 
int serverListenPort 10000;
    public 
bool RWork true;
    
TcpListener listener = new TcpListener(IPAddress.AnyserverListenPort);
    public 
void main()
    {
       
listener.Start();

    }
    public 
void Run()
    {
        while (
RWork)
        {
            while (!
listener.Pending())
            {
                
Thread.Sleep(50);
                if (
RWork==false)
                    break;

            }
            if (
RWork == true)
            {
                
Socket newSocket2 listener.AcceptSocket();
                if (
newSocket2 != null)
                {
                    
SocketCounter++;
                    
newSocket[SocketCounter] = newSocket2;
                    
System.Console.WriteLine("Neue Client-Verbindung (" +
                    
"IP: " newSocket[SocketCounter].RemoteEndPoint ", " +
                    
"Port " + ((IPEndPoint)newSocket[SocketCounter].LocalEndPoint).Port.ToString() + ")");
                }
            }
        }
    }
    public 
void StopRun()
    {
        
RWork false;
    }
    public 
void Recieve_Check(Socket client)
    {

          
int maxBuffer=150;
          
buffer = new byte[maxBuffer];
          
received client.Receive(buffer);
          
UTF8Encoding encoding = new UTF8Encoding();
          
empfangen encoding.GetString(buffer0received);
          
Console.WriteLine(empfangen);          
    }
    public 
void Recieve_Check_Main()
    {
        for (
int cco 1cco <= SocketCountercco++)
        {
            
Recieve_Check(newSocket[cco]);
        }
    }
}

public class 
Client
    
{
        public 
Client(String Address,int port)
        {
                
Thread.Sleep(5000);
                
IPHostEntry hostInfo Dns.GetHostByName(Address);
                
System.Net.IPEndPoint ep = new System.Net.IPEndPoint(hostInfo.AddressList[0],port);
                
Socket socket = new Socket(AddressFamily.InterNetworkSocketType.StreamProtocolType.Tcp );
                
socket.Connect(ep);
                
Thread.Sleep(1000);
                
string request "Test String";
                
Byte[] bytesSent Encoding.ASCII.GetBytes(request);
                
Byte[] bytesReceived = new Byte[256];
                
socket.Send(bytesSentbytesSent.Length0); 

        }

Was machts,sollte es bis jezt?
main -->startet nur listener
Run/Stoprun-->eigener Threadprozess der Verbindungen in einem array abspeichert
RecieveCheck/R_C_Main-->sollte als thread gestartet werden und über Console.Writeline(recieve) empfangen daten ausgeben.
Client: connected mit Server , schickt nen kleinen Teststring.
Prob: Teststring wird nicht über Konsole ausgegeben

Weis wer warum? :>

Mfg Sevenby7
01/13/2011 20:27 nkkk#2
PHP Code:
        for (int cco 1cco <= SocketCountercco++)
        { 
ist wahrscheinlich dein fehler.


€ sind sowiet ich es sehe sogar 2 fehler^^.
01/13/2011 20:34 BLODDYKILL#3
Quote:
Originally Posted by nkkk View Post
PHP Code:
        for (int cco 1cco <= SocketCountercco++)
        { 
ist wahrscheinlich dein fehler.


€ sind sowiet ich es sehe sogar 2 fehler^^.
"Wenn keine Daten zum Lesen zur Verfügung stehen, wird die Receive-Methode blockiert, bis Daten verfügbar sind. Wenn im nicht blockierenden Modus keine Daten im Protokollstapelpuffer vorhanden sind, wird die Receive-Methode sofort beendet und löst eine SocketException aus. Mit der Available-Eigenschaft können Sie bestimmen, ob Daten zum Lesen verfügbar sind. Wenn Available ungleich 0 (null) ist, führen Sie den Empfangsvorgang erneut aus. "

Socket.Recieve also block bis was an kommt...
denke mal wenn ich für jeden Client einen eigenen Thread eröffne löst es des Problem.
01/13/2011 20:56 nkkk#4
????
habe ich irgendwp geasgt das
"Socket.Recieve" falsch ist?

wenn du den debugger beutzt kannst du das prob. auch selbst finden.

Ja jeden client in eigen eigenen thread öffnen macht auch sinn.
01/15/2011 23:11 hallamasch#5
Hau mal die ganzen Thread.Sleeps raus und pack deinen Client mal in eine separate Anwendung.

Dann kannste erstmal richtig testen.