C# socket連線斷開問題
這一篇文章,我將圖文並茂地介紹Socket程式設計的基礎知識,我相信,如果你按照步驟做完實驗,一定可以對Socket程式設計有更好地理解。
第一步:建立解決方案
第二步:建立服務端程式
這裡可以選擇“Console Application”這個型別,比較方便除錯
然後編寫如下程式碼,實現伺服器的基本功能
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;
namespace SocketServer
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//將該socket繫結到主機上面的某個埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
socket.Bind(new IPEndPoint(IPAddress.Any, 4530));
//啟動監聽,並且設定一個最大的佇列長度
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
socket.Listen(4);
Console.WriteLine("Server is ready!");
Console.Read();
}
}
}
現在可以啟動除錯一下看看效果如何,正常情況下應該會看到一個提示,因為我們需要在TCP 4530埠進行監聽,所以防火牆會有提示。
點選“Allow access”
這樣,我們的伺服器就可以開始監聽了。但是這有什麼用呢?是的,沒有什麼用。
我們還需要為伺服器新增一些功能,例如接受傳入的請求,給客戶端傳送訊息,或者從客戶端接收訊息等等
第三步:接受傳入的請求
我們需要通過Accept,或者(BeginAccept)來接受傳入的請求,請注意下面程式碼中的紅色部分
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;
namespace SocketServer
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//將該socket繫結到主機上面的某個埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
socket.Bind(new IPEndPoint(IPAddress.Any, 4530));
//啟動監聽,並且設定一個最大的佇列長度
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
socket.Listen(4);
//開始接受客戶端連線請求
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
socket.BeginAccept(new AsyncCallback((ar) =>
{
//這就是客戶端的Socket例項,我們後續可以將其儲存起來
var client = socket.EndAccept(ar);
//給客戶端傳送一個歡迎訊息
client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));
}), null);
Console.WriteLine("Server is ready!");
Console.Read();
}
}
}
wow,看起來不錯對吧,我們趕緊做一個客戶端來測試一下吧
第四步:建立客戶端
我們還是使用一個Console Application
新增如下的程式碼,並且建立客戶端連線
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//匯入的名稱空間
using System.Net.Sockets;
namespace SocketClient
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//連線到指定伺服器的指定埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
socket.Connect("localhost", 4530);
Console.WriteLine("connect to the server");
Console.Read();
}
}
}
依次選擇SocketServer和SocketClient這兩個專案,分別將其啟動為除錯狀態(右鍵選單,Debug=>Start new instance)
我們看到兩個程式都工作正常。
但是,在客戶端怎麼沒有收到伺服器發過來的訊息呢?那是因為,我們沒有在客戶端提供這方面的功能。
第五步:在客戶端中實現接受訊息的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//匯入的名稱空間
using System.Net.Sockets;
namespace SocketClient
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//連線到指定伺服器的指定埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
socket.Connect("localhost", 4530);
//實現接受訊息的方法
var buffer = new byte[1024];//設定一個緩衝區,用來儲存資料
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback((ar) =>
{
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar);
//讀取出來訊息內容
var message = Encoding.Unicode.GetString(buffer, 0, length);
//顯示訊息
Console.WriteLine(message);
}), null);
Console.WriteLine("connect to the server");
Console.Read();
}
}
}
請注意以上紅色的部分,我們用了BeginReceive方法進行非同步的訊息偵聽,如果收到了,我們就打印出來
看起來已經實現了我們需求了:伺服器給客戶端發了一個訊息,而客戶端也已經收到了。
但是,這遠遠不夠,因為它們之間的通訊不僅僅是一次性的,那麼如果伺服器要不斷地給客戶端發訊息,例如每隔兩秒鐘就傳送一個訊息,如何實現呢?
第六步:實現伺服器定期向客戶端發訊息
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;
namespace SocketServer
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//將該socket繫結到主機上面的某個埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
socket.Bind(new IPEndPoint(IPAddress.Any, 4530));
//啟動監聽,並且設定一個最大的佇列長度
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
socket.Listen(4);
//開始接受客戶端連線請求
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
socket.BeginAccept(new AsyncCallback((ar) =>
{
//這就是客戶端的Socket例項,我們後續可以將其儲存起來
var client = socket.EndAccept(ar);
//給客戶端傳送一個歡迎訊息
client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));
//實現每隔兩秒鐘給伺服器發一個訊息
//這裡我們使用了一個定時器
var timer = new System.Timers.Timer();
timer.Interval = 2000D;
timer.Enabled = true;
timer.Elapsed += (o, a) =>
{
client.Send(Encoding.Unicode.GetBytes("Message from server at " +DateTime.Now.ToString()));
};
timer.Start();
}), null);
Console.WriteLine("Server is ready!");
Console.Read();
}
}
}
我們還要實現在客戶端一直監聽訊息的機制,而不是一次性接收.請注意下面紅色的部分
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//匯入的名稱空間
using System.Net.Sockets;
namespace SocketClient
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//連線到指定伺服器的指定埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
socket.Connect("localhost", 4530);
Console.WriteLine("connect to the server");
//實現接受訊息的方法
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage),socket);
Console.Read();
}
static byte[] buffer = new byte[1024];
public static void ReceiveMessage(IAsyncResult ar)
{
try
{
var socket = ar.AsyncState as Socket;
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar);
//讀取出來訊息內容
var message = Encoding.Unicode.GetString(buffer, 0, length);
//顯示訊息
Console.WriteLine(message);
//接收下一個訊息(因為這是一個遞迴的呼叫,所以這樣就可以一直接收訊息了)
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
catch(Exception ex){
Console.WriteLine(ex.Message);
}
}
}
}
重新除錯起來,看起來的效果如下圖所示
我們繼續做下面的實驗,一步一步地研究Socket通訊中可能遇到的一些問題
請先關閉掉客戶端這個程式,而不要關閉服務端程式,這時會發現一個錯誤
這個錯誤很容易理解,因為客戶端已經關閉,也就是客戶端那個Socket已經不存在了,伺服器還繼續向它傳送訊息當然會出錯。所以,從可靠性方面的考慮,我們必須在傳送訊息之前檢測Socket的活動狀態
第七步:檢測客戶端的活動狀態
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;
namespace SocketServer
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//將該socket繫結到主機上面的某個埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
socket.Bind(new IPEndPoint(IPAddress.Any, 4530));
//啟動監聽,並且設定一個最大的佇列長度
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
socket.Listen(4);
//開始接受客戶端連線請求
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
socket.BeginAccept(new AsyncCallback((ar) =>
{
//這就是客戶端的Socket例項,我們後續可以將其儲存起來
var client = socket.EndAccept(ar);
//給客戶端傳送一個歡迎訊息
client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));
//實現每隔兩秒鐘給伺服器發一個訊息
//這裡我們使用了一個定時器
var timer = new System.Timers.Timer();
timer.Interval = 2000D;
timer.Enabled = true;
timer.Elapsed += (o, a) =>
{
//檢測客戶端Socket的狀態
if(client.Connected)
{
try
{
client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));
}
catch(SocketException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
timer.Stop();
timer.Enabled = false;
Console.WriteLine("Client is disconnected, the timer is stop.");
}
};
timer.Start();
}), null);
Console.WriteLine("Server is ready!");
Console.Read();
}
}
}
上面程式碼的邏輯很清楚,但有時候還是會觸發那個SocketException。為什麼呢?這是因為我們的Timer是每隔兩秒鐘檢查一次,那麼就很可能有一種情況,我們檢查的時候,它還是連線狀態,訊息發出去之後,它斷開了。這種情況肯定是存在的。所以要用Try..catch的結構
目前我們實現的場景很簡單,伺服器只管發訊息,客戶端只管收訊息。但實際工作中,可能希望伺服器和客戶端都能收發訊息。請看下一節
第八步:實現雙向收發訊息
先看服務端的修改
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;
namespace SocketServer
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//將該socket繫結到主機上面的某個埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
socket.Bind(new IPEndPoint(IPAddress.Any, 4530));
//啟動監聽,並且設定一個最大的佇列長度
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
socket.Listen(4);
//開始接受客戶端連線請求
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
socket.BeginAccept(new AsyncCallback((ar) =>
{
//這就是客戶端的Socket例項,我們後續可以將其儲存起來
var client = socket.EndAccept(ar);
//給客戶端傳送一個歡迎訊息
client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));
//實現每隔兩秒鐘給伺服器發一個訊息
//這裡我們使用了一個定時器
var timer = new System.Timers.Timer();
timer.Interval = 2000D;
timer.Enabled = true;
timer.Elapsed += (o, a) =>
{
//檢測客戶端Socket的狀態
if(client.Connected)
{
try
{
client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));
}
catch(SocketException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
timer.Stop();
timer.Enabled = false;
Console.WriteLine("Client is disconnected, the timer is stop.");
}
};
timer.Start();
//接收客戶端的訊息(這個和在客戶端實現的方式是一樣的)
client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveMessage),client);
}), null);
Console.WriteLine("Server is ready!");
Console.Read();
}
static byte[] buffer = new byte[1024];
public static void ReceiveMessage(IAsyncResult ar)
{
try
{
var socket = ar.AsyncState as Socket;
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar);
//讀取出來訊息內容
var message = Encoding.Unicode.GetString(buffer, 0, length);
//顯示訊息
Console.WriteLine(message);
//接收下一個訊息(因為這是一個遞迴的呼叫,所以這樣就可以一直接收訊息了)
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
catch(Exception ex){
Console.WriteLine(ex.Message);
}
}
}
}
可以看出來,為了讓伺服器可以接受訊息,其實並不需要什麼特別的設計,與客戶端接受訊息其實可以是一樣的
再來看看客戶端的修改
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//匯入的名稱空間
using System.Net.Sockets;
namespace SocketClient
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//連線到指定伺服器的指定埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
socket.Connect("localhost", 4530);
Console.WriteLine("connect to the server");
//實現接受訊息的方法
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
//接受使用者輸入,將訊息傳送給伺服器端
while(true)
{
var message = "Message from client : " + Console.ReadLine();
var outputBuffer = Encoding.Unicode.GetBytes(message);
socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);
}
}
static byte[] buffer = new byte[1024];
public static void ReceiveMessage(IAsyncResult ar)
{
try
{
var socket = ar.AsyncState as Socket;
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar);
//讀取出來訊息內容
var message = Encoding.Unicode.GetString(buffer, 0, length);
//顯示訊息
Console.WriteLine(message);
//接收下一個訊息(因為這是一個遞迴的呼叫,所以這樣就可以一直接收訊息了)
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
我在這裡做了一個死迴圈,使用者可以不斷地輸入,這些訊息會被髮送給伺服器。如下圖所示
【備註】因為伺服器每隔兩秒鐘會發送新訊息過來,所以在輸入的時候,動作要稍快一點啦
本文最後探討一個問題,就是如何讓我們的伺服器可以支援多個客戶端
第九步:支援多個客戶端
這個步驟只需要修改服務端程式即可
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//額外匯入的兩個名稱空間
using System.Net.Sockets;
using System.Net;
namespace SocketServer
{
class Program
{
/// <summary>
/// Socket Server 演示
/// 作者:陳希章
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//建立一個新的Socket,這裡我們使用最常用的基於TCP的Stream Socket(流式套接字)
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//將該socket繫結到主機上面的某個埠
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
socket.Bind(new IPEndPoint(IPAddress.Any, 4530));
//啟動監聽,並且設定一個最大的佇列長度
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
socket.Listen(4);
//開始接受客戶端連線請求
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
Console.WriteLine("Server is ready!");
Console.Read();
}
public static void ClientAccepted(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
//這就是客戶端的Socket例項,我們後續可以將其儲存起來
var client = socket.EndAccept(ar);
//給客戶端傳送一個歡迎訊息
client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));
//實現每隔兩秒鐘給伺服器發一個訊息
//這裡我們使用了一個定時器
var timer = new System.Timers.Timer();
timer.Interval = 2000D;
timer.Enabled = true;
timer.Elapsed += (o, a) =>
{
//檢測客戶端Socket的狀態
if(client.Connected)
{
try
{
client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));
}
catch(SocketException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
timer.Stop();
timer.Enabled = false;
Console.WriteLine("Client is disconnected, the timer is stop.");
}
};
timer.Start();
//接收客戶端的訊息(這個和在客戶端實現的方式是一樣的)
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
//準備接受下一個客戶端請求
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
}
static byte[] buffer = new byte[1024];
public static void ReceiveMessage(IAsyncResult ar)
{
try
{
var socket = ar.AsyncState as Socket;
//方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar);
//讀取出來訊息內容
var message = Encoding.Unicode.GetString(buffer, 0, length);
//顯示訊息
Console.WriteLine(message);
//接收下一個訊息(因為這是一個遞迴的呼叫,所以這樣就可以一直接收訊息了)
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
catch(Exception ex){
Console.WriteLine(ex.Message);
}
}
}
}
最後除錯起來看到的效果如下圖
相關推薦
C# socket連線斷開問題
這一篇文章,我將圖文並茂地介紹Socket程式設計的基礎知識,我相信,如果你按照步驟做完實驗,一定可以對Socket程式設計有更好地理解。 第一步:建立解決方案 第二步:建立服務端程式 這裡可以選擇“Console Application”這個型別,比較方便除錯 然後編寫如下程式碼,實現伺服器的基本
C# Socket連線請求超時機制
轉自:http://www.cnblogs.com/weidagang2046/archive/2009/02/07/1385977.html 作者:RazanPaul 譯者:Todd Wei 原文:http://www.codeproject.com/KB/IP/Time
安卓 java有效判斷Socket連線斷開和安卓TCP測試APP(客戶+服務端一體)
1. 利用socket提供的isConnected()與isClosed()方法來判斷。但這種方式只是本地判斷,只是本地操作connect()或close()方法後儲存的一個狀態,對於遠端伺服器主動斷開
C 中設定Socket連線請求的超時
C#中, 對於Socket的請求,無論是同步還是非同步,都沒有提供超時機制,SendTimeout,ReceiveTimeout均無用..對於需要測試網路是否正常連線的情況下,,超時控制很是有用, 如果伺服器不存在,或是客戶機網路異常,, 在沒有設定超時的情況下,,Socke
c#關於socket連線超時控制的方案
之前有一個專案用到Remoting技術,當遠端的地址無效或伺服器沒執行時,訪問遠端物件方法,會經過幾十秒的時間才丟擲異常。因為我用的是tcp模式,所以想到可以用socket來測試連線,就可以在呼叫遠端物件方法之前知道遠端服務有沒有執行。程式碼如下: public clas
關於C#Socket斷開重連問題
TCP客戶端可以向TcpServer傳送資料包時,若網路斷開,原來的連線就會失效,出現以下錯誤提示: 斷開套接字連線後,只能通過非同步方式再次重新連線,而且只能連線到不同的 EndPoint。在操作完成前,在將不會退出的執行緒上必須呼叫 BeginConnect
網頁websocket正常和C#websocket-csharp 斷開連線問題
最近在做一個pc端的 websocket客戶端。從網上找了 websocket-csharp 這個包。 一切正常。。。 可是後來發現websocket 在沒有資料推送的情況下過一段時間,會沒有資料推送。 但我的websocket 有重連機制。就是在OnClose 事件裡重新
如何判斷一個SOCKET連線是否已經斷開
1. 根據ERRNO和recv結果進行判斷 在UNIX/Linux下,非阻塞模式SOCKET可以採用recv+MSG_PEEK的方式進行判斷,其中MSG_PEEK保證了僅僅進行狀態判斷,而不影響資料接收 對於主動關閉的SOCKET, recv返回-1,而且errno被置為9(#define EBADF
C#中設定Socket連線請求的超時
C#中, 對於Socket的請求,無論是同步還是非同步,都沒有提供超時機制,SendTimeout,ReceiveTimeout均無用.. 對於需要測試網路是否正常連線的情況下,,超時控制很是有用, 如果伺服器不存在,或是客戶機網路異常,, 在沒有設定超時的情況下,,So
C# Socket.Connect連線請求超時機制
作者:RazanPaul 譯者:Todd Wei 原文:http://www.codeproject.com/KB/IP/TimeOutSocket.aspx 轉自:http://hi.baidu.com/wf_studio/blog/item/d0a339f4c70c9a
問題:解決Android中socket自動斷開連線
在strain sensor APP開發過程當中,需要客戶端不斷地讀取從藍芽模組傳送過來的資料。 遇到的問題: 連線上藍芽模組後,能夠正常讀數,藍芽資料傳送速率為0.03s每個。大概在傳送了342個數據之後,突然接收不到資料了。 後來查找了資料,顯示原來A
C++ Socket C/S ,實現客戶端,伺服器端斷開重連
// WindowsSocketServer.cpp : 定義控制檯應用程式的入口點。 #include "stdafx.h" #include <iostream> #include <string> #include <Windows.h> #include <
Socket 程式設計經驗談---如何處理socket連線後伺服器端或客戶端的斷開
現象:伺服器端等待客戶斷連線,當socket連線建立後,如果客戶端異常斷開,伺服器會丟擲異常,從而導致程式執行中斷 目標:希望伺服器一直等待連線,客戶端中斷後程式不退出,而客戶端重新恢復後可以繼續保持連線 程式碼: public class Receive { publi
C++socket客戶端select非同步連線傳送接收資料
這段時間公司專案一直用網口同底層裝置互動,顧記錄下,具體見程式碼: int RFID_STANDARDPROTOCOL_API __stdcall Socket_SendAndRecv(SOCKET Socket, unsigned char * SendBuf
客戶端怎麼判斷Socket連線已與伺服器斷開
First of all , Server's socekt is not close. if u had closed client's socekt , u should creat it again when u want to connect server's. socket即使close了,也還
c++ socket 編程步驟
socket 編程 客戶機 connect 服務器 nbsp listen 步驟 ket sock 服務器 socket() bind() listen() 客戶機 accept()
C# Socket網絡編程精華篇
類型 重復 呼叫 物理 http協議 nts byte .so binding 幾個和Socket編程緊密相關的概念: TCP/IP層次模型 當然這裏我們只討論重要的四層 01,應用層(Application):應用層是個很廣泛的概念,有一些基本相
使用C#+socket實現用移動設備控制的虛擬手柄
sock endpoint network 回車 byte arraylist program 行處理 favor 最近在和同學玩死神vs火影。以懷念小時候,突然認為用鍵盤玩的不夠暢快,因此萌生了寫一個虛擬手柄的念頭。 我的思路是在移動設備(iOS、Android)上實
C#socket通訊服務器(連接狀態監控)
del endpoint etc acc ipa ack ipaddress ava listening class SocketServerManager { public delegate void ConnectStateEventHandler
C# socket 無法再次接收到廣播包的回復
soc 端口 share 對象 進行 使用 釋放 回復 har 問題描述 當進行了一次成功的廣播後(發出並收到回復),再進行一次廣播後,無法接到手回復信息,但通過Wiresharek能看到,接收方已經成功返回回復信息。 原因 設置了socket可重復綁定相同端