[英]socket time out in socket programming
我的硬件比臨時網絡中的筆記本電腦(服務器)要多。
服務器單獨發送數據時,它可以正常工作。 並且客戶端單獨發送數據,也可以正常工作。
但是,當服務器和客戶端一起發送數據時,經過一段時間,就會發生超時。
35,有時33包之后將發生超時。
我更改了硬件的傳輸速率,但也斷開了連接。
盡管硬件支持全雙工。
超時后,我對硬件執行ping操作,但它不在端口上。
並檢查服務器上的端口,它是開放的。
我能怎么做?
byte[] bytes = new byte[512];
//try
//{
IPHostEntry ipHost = Dns.GetHostEntry("");
// Gets first IP address associated with a localhost
IPAddress add = ipHost.AddressList[3];
TcpListener tcpListener = new TcpListener(add, 6000);
tcpListener.Start();
TcpClient tcpClient = tcpListener.AcceptTcpClient();
NetworkStream stream = tcpClient.GetStream();
String data = null;
while (true)
{
int j = 0;
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
j = j + 1;
// Translate data bytes to a ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
AddItem("j="+j+" Received:"+ data);
// Process the data sent by the client.
//data = data.ToUpper();
byte[] msg = System.Text.Encoding.ASCII.GetBytes("thanks");
// Send back a response.
stream.Write(msg, 0, msg.Length);
AddItem("Sent:"+"thanks");
}
// Shutdown and end connection
tcpClient.Close();
標准套接字調用都處於阻塞狀態,因此,如果兩個參與者都在相互發送消息,則他們各自等待對方接收他們發送的消息,從而導致死鎖 。
在.NET中,有三種典型的解決方案:
Socket.Select()
編寫之前,可以通過測試可讀數據來自己處理異步活動。 這是一種典型的輪詢方法,但是您需要自己做所有事情,並且需要確保沒有飢餓或其他偏見。 Read
和Write
代碼放在不同的線程中,以便阻塞一個線程不會阻塞整個程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.