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.
Hangi sunucuya bağlanıyorsunuz? Sunucunun bağlantıyı kesmediğinden nasıl emin oldunuz? – usr
@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
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