2016-04-10 41 views
1

Bir sunucuya bağlanmak için Github üzerinde bir kütüphane kullanıyorum çünkü C# 'daki soketlere aşina değilim. bağlantı kurmak için sözdizimi adildir:İlk kez soketin çıkarılması

Connector con = new Connector(ip, port, cipher); 
con.Connect(); 

şifre parametre sunucu kullanır ve benim soru için önemsizdir şifreleme sadece biçimidir, sanırım.

Connect() yöntemini çağırdıktan sonra kitaplık eşzamansız bir hale getiriyor ve bundan sonra ne olduğundan emin değilim. Benim sorum, uygulamamı kurduğumda ve sunucuya bağlanmayı denediğimde, yalnızca ilk denemede bağlantısının kesildiğidir. Sonra tekrar bağlanmaya çalışırsam program iyi çalışır. Burada Socket.BeginReceive geri arama yöntemi sorun kaynağı iz mümkün: socket.EndReceive SocketError.ConnectionReset ile bağlantısını kesmek için bir program neden olan 0 uzunluğuna dönen

private void Receive() { 
    if (m_connected) { 
     var error = SocketError.Success; 

     m_socket.BeginReceive(m_recvBuffer, 0, ReceiveSize, SocketFlags.None, out error, PacketCallback, null); 

     if (error != SocketError.Success) { 
      Disconnect(); 
     } 
    } 
} 

private void PacketCallback(IAsyncResult iar) { 
    if (m_connected) { 
     var error = SocketError.Success; 
     int length = m_socket.EndReceive(iar, out error); 

     if (length == 0 || error != SocketError.Success) { 
      Disconnect(); 
     } 
     else { 
      Append(length); 
      ManipulateBuffer(); 
      Receive(); 
     } 
    } 
} 

. Sadece neden sadece ilk bağlantı girişimde olduğunu anlayamıyorum. Her sonraki bağlantı girişimi iyi çalışıyor. Yuvalara aşina olan biri, kitaplık kodunda bir hata olup olmadığını ve bir düzeltme olup olmadığını söyleyebilir mi? Aksi takdirde, sunucu tarafı tarafında bir hata olduğunu varsaymak zorundayım. Teşekkürler.


+0

Hangi sunucuya bağlanıyorsunuz? Sunucunun bağlantıyı kesmediğinden nasıl emin oldunuz? – usr

+0

@usr Bu benim merak ettiğim şey. Sunucunun bağlantısının kesilip kesilmediğini bilmenin hiçbir yolu yok. Bu yüzden kütüphanenin herhangi bir problemi olmadığını biliyorsam, sorunun sadece kontrolümün dışında olduğu sonucuna varabilirim. – Andrew

+0

Tamam, bunu yapmak için kendi soket programınızı yazın. Senkronize IO kullanın. Eğer tam bir doğruluğa değil, sadece bir teste ihtiyacınız varsa bunu yapmak oldukça basit. – usr

cevap

-1

Soket yardımcılarını kullanmayın. Soketin .net'de kullanımı çok kolaydır.

bu msdn örneğe göz atın:

https://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.110).aspx Yukarıdaki linkte kodunu kullanın. Umarım senin için çalışacaktır.

+0

??? Soketler kullanmak çok zor. Sayısız hata var, her gün katliamı görüyorum. Bu cevap bana doğru bir soket uygulaması yazılmadığını söyledi. Ayrıca, bu bir cevap değil. – usr

+0

Şimdi MSDN örneğine bakın. Bu, en korkunç MSDN örneklerinden biridir. Bu kod bir iğrençliktir. – usr

+0

Bu soketin süper sert olduğunu düşünmüyorum. Scoketler için pek çok yardım var. Superhard bunun için yardım bulamadığınız bir şeydir :) – Saif

İlgili konular