Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
.NET Framework
Server Asincrono
lunedì 19 dicembre 2005 - 20.37
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Dokkis
Profilo
| Newbie
34
messaggi | Data Invio:
lun 19 dic 2005 - 20:37
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
7.999
messaggi | Data Invio:
mer 21 dic 2005 - 12:14
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/
Torna su
Stanze Forum
Elenco Threads
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 !