Server Asincrono

lunedì 19 dicembre 2005 - 20.37

Dokkis Profilo | Newbie

Ciao a tutti, sto cercando di progettare un server asincrono in c#, utilizzando quindi la chiamata in callback della funzione beginaccept per ricevere i socket, utilizzo beginreceive per ricevere i msg del socket e beginsend per mandarli.. il problema è questo, quando un user si disconnette esce scritto questo in console (è una applicazione console):

Eccezione non gestita: System.NullReferenceException: Riferimento a un oggetto n
on impostato su un'istanza di oggetto.
at System.Net.OSSOCK.WSAGetOverlappedResult(IntPtr socketHandle, IntPtr overl
apped, UInt32& bytesTransferred, Boolean wait, IntPtr ignored)
at System.Net.Sockets.OverlappedAsyncResult.CompletionPortCallback(UInt32 err
orCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)

premesso che ho try catchato TUTTI i possibili punti in cui può andare in eccezione (ma probabilmente nn è dovuta al mio codice l'eccezione, provando anche esempi su internet di server asincroni in c# danno lo stesso problema!) cercando su internet ho visto che ad alcuni da questo errore tipo quando hanno nod32 installato o cose simili... io ho momentaneamente disinstallato antivirus e firewall.. il problema cmq rimane... il codice che uso è questo:

public void ListenPort(int port)
{
try
{
IPHostEntry ipHostInfo = Dns.Resolve("0.0.0.0");
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress,port);
srv = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
srv.Bind(localEndPoint);
srv.Listen(200);
srv.BeginAccept(new AsyncCallback(OnAccept),srv);
Class1.WriteToConsole("Server start on port "+port);
}
catch(SocketException)
{
Class1.WriteToConsole("ERROR: The port is already in use!");
}
}

private void OnAccept(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
try
{
Socket client = listener.EndAccept(ar);
listener.BeginAccept(new AsyncCallback(OnAccept),listener);
ConnectionIncoming(client);
}
catch{listener.BeginAccept(new AsyncCallback(OnAccept),listener);}
}

void ConnectionIncoming(Socket client)
{
string ip = client.RemoteEndPoint.ToString().Substring(0,client.RemoteEndPoint.ToString().IndexOf(":"));
User user = new User(client,ip);
Util.Users.Add(user);
client.Send(Encoding.Default.GetBytes("$Lock "+Util.Lock+" Pk=version"+Util.Versione+"|"));
try
{
client.BeginReceive(user.Buffer,0,user.Buffer.Length,SocketFlags.None,new AsyncCallback(OnReceive),user);
}
catch{}
}

void OnReceive(IAsyncResult ar)
{
User user = (User)ar.AsyncState;
Socket client = user.Client;

if(client.Connected)
{
try
{
int recv = client.EndReceive(ar);
if(recv>0)
{
string datareceived = Encoding.Default.GetString(user.Buffer);
byte[] temp = new byte[]{0};
string temp1 = Encoding.Default.GetString(temp);
datareceived=datareceived.Replace(temp1,"");
string[] split=datareceived.Split('|');
foreach(string data in split)

Brainkiller Profilo | Guru

Ciao Dokkis,
ti va in crash su una particolare linea di codice ?

Eh, riguardo al problema di Nod32 è un bel problema. Nel senso che forse potrebbe causare qualche malfunzionamento anche se lo escluderei a priori perchè se no non funzionerebbero anche altri softwre sempre che l'implementazione del tuo sia stata fatta correttamente.

Riguardo alla sconnessione dell'utente, beh è un problema classico, anche con socket sincroni succede la stessa cosa, e dev'essere ben gestita salvo incontrare problemi di consumo anomalo di CPU, o crash.

Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5