Ketika Klien mencoba untuk menyambung ke alamat IP yang terputus, ada waktu tunggu yang lama selama 15 detik ... Bagaimana kami dapat mengurangi batas waktu ini? Apa metode untuk mengkonfigurasinya?
Kode yang saya gunakan untuk menyiapkan koneksi soket adalah sebagai berikut:
try
{
m_clientSocket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(serverIp);
int iPortNo = System.Convert.ToInt16(serverPort);
IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);
m_clientSocket.Connect(ipEnd);
if (m_clientSocket.Connected)
{
lb_connectStatus.Text = "Connection Established";
WaitForServerData();
}
}
catch (SocketException se)
{
lb_connectStatus.Text = "Connection Failed";
MessageBox.Show(se.Message);
}
null
di untukcallback
dan Anda berencana untukEndConnect()
, jika soket telahclosed
maka ini akan memberikan pengecualian. Jadi pastikan Anda memeriksa ...AsyncWaitHandle.WaitOne
akan diberi sinyal, tetapi soket akan tetap tidak tersambung.Saya ambil:
sumber
SocketExtension
, Anda masih belum terbiasa.Connected
melihat apakah Anda, dan Anda tidak menggunakansocket.Connected = true;
untuk mendefinisikansuccess
.Saya baru saja menulis kelas ekstensi untuk memungkinkan batas waktu dalam koneksi. Gunakan persis seperti Anda akan menggunakan
Connect()
metode standar , dengan parameter tambahan bernamatimeout
.sumber
socket.EndConnect
mengambil ~ 10 detik untuk menutup sehingga fungsi kembali tidak setelah rentang waktu tetapi setelah waktu jangka waktu yang + endConnectSaya tidak memprogram di C # tetapi di C, kami menyelesaikan masalah yang sama dengan membuat soket non-pemblokiran dan kemudian meletakkan fd di loop pilih / polling dengan nilai batas waktu yang sama dengan jumlah waktu kami bersedia menunggu untuk terhubung untuk berhasil.
Saya menemukan ini untuk Visual C ++ dan penjelasannya di sana juga mengarah ke mekanisme pemilihan / jajak pendapat yang saya jelaskan sebelumnya.
Dalam pengalaman saya, Anda tidak dapat mengubah nilai batas waktu koneksi per soket. Anda mengubahnya untuk semua (dengan menyetel parameter OS).
sumber
mungkin sudah terlambat tetapi ada solusi tepat berdasarkan Task.WaitAny (c # 5 +):
sumber
Saya memecahkan masalah dengan menggunakan Metode Socket.ConnectAsync daripada Metode Socket.Connect. Setelah menjalankan Socket.ConnectAsync (SocketAsyncEventArgs), mulai pengatur waktu (timer_connection), jika waktu habis, periksa apakah koneksi soket terhubung (jika (m_clientSocket.Connected)), jika tidak, muncul kesalahan batas waktu.
sumber
Lihat ini di MSDN . Tampaknya Anda tidak dapat melakukan ini dengan properti yang diimplementasikan di kelas Socket.
Poster di MSDN benar-benar memecahkan masalahnya dengan menggunakan threading. Dia memiliki utas utama yang memanggil utas lain yang menjalankan kode koneksi selama beberapa detik dan kemudian memeriksa properti Connected dari soket:
Apa yang Anda coba lakukan, dan mengapa tidak bisa menunggu selama 15-30 detik sebelum waktunya habis?
sumber
Saya memiliki masalah yang sama saat menghubungkan ke Socket dan saya menemukan solusi di bawah ini, Ini berfungsi dengan baik untuk saya. `
sumber
Saya bekerja dengan Unity dan mengalami masalah dengan BeginConnect dan metode asinkron lainnya dari soket.
Ada sesuatu yang tidak saya mengerti tetapi contoh kode sebelumnya tidak berfungsi untuk saya.
Jadi saya menulis kode ini untuk membuatnya berfungsi. Saya mengujinya di jaringan adhoc dengan android dan pc, juga di lokal di komputer saya. Semoga bisa membantu.
dan ada pengawas yang sangat sederhana di C # untuk membuatnya bekerja:
sumber
Ini seperti jawaban FlappySock, tapi saya menambahkan callback karena saya tidak suka tata letaknya dan bagaimana Boolean dikembalikan. Di komentar jawaban dari Nick Miller:
Jadi bagi saya, tampaknya mengandalkan apa yang dikembalikan bisa berbahaya - saya lebih suka menggunakan
socket.Connected
. Saya menetapkan Boolean nullable dan memperbaruinya dalam fungsi callback. Saya juga menemukan itu tidak selalu selesai melaporkan hasil sebelum kembali ke fungsi utama - saya menanganinya juga, dan membuatnya menunggu hasil menggunakan batas waktu:Terkait: Bagaimana cara memeriksa apakah saya terhubung?
sumber
Harus ada properti ReceiveTimeout di kelas Socket.
Socket.ReceiveTimeout Properti
sumber
ReceiveTimeout
- ini hanya untuk saat menerima denganBeginReceive
danEndReceive
. Tidak ada padanan ketika Anda hanya melihat apakah Anda terhubung.