C# 中 Socket 進行資料接收的一點心得

來源:互聯網
上載者:User
在利用Socket 進行Tcp/Ip 編程的時候,免不了要進行資料的發送和接收,而資料的接收,用得最多的就是 Socket 的同步函數 Receive (或它的重載):public int Receive (    byte[] buffer,    int offset,    int size,    SocketFlags socketFlags)或者是非同步函數 BeginReceive( 或它的重載): public IAsyncResult BeginReceive (    byte[] buffer,    int offset,    int size,    SocketFlags socketFlags,    AsyncCallback callback,    Object state)這裡,我想說的是非同步函數 BeginReceive()。使用了非同步函數BeginReceive(),伴隨而來的就是要定義一個 AsyncCallback 類型的函數(如下面取名為ReceiveEnd的函數),在這個函數裡面,我們最少要做的事情時調用 Socket 的 EndReceive() 函數。 protected void ReceiveEnd(IAsyncResult ar){    Socket client = (Socket)ar.AsyncState;    int recvLen = client.EndReceive(ar);    if ( recvLen > 0){        /**//* 接收到了資料 */        client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveEnd), client);  /**//* 繼續接收資料*/    }    else{        client.Close();          }}
在Msdn 2005 的 ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref10/html/M_System_Net_Sockets_Socket_BeginReceive_3_2b547d4d.htm基本上就是上面這個意思,但是現在問題來了:如果我定義的 buffer 的長度為 10,但我發送的資料長度為12或者8,那麼,函數就不會走到 else 的部分,而是阻塞在函數中的 BeginReceive()調用。開始,我的想法是在發送的資料尾部增加一個特殊的字元(串),然後,在接收的時候判斷有沒有接收到這個字元(串)(我查閱了網上一些資料,還真有一些是這麼做的!),但是,這種做法始終有一個毛病:那就是發送端發送的本文裡面不能含有這個字元(串),否則,本文中在這個字元(串)後面的本文就會被丟掉。所以,我想還是只能通過 Socket 自己的內部機制來實行,也就是想辦法使程式走到 else 的部分。經過測試:在用戶端發送完資料後,使用 Socket.Shutdown(SocketShutdown.Send ),或者Socket.Close()可以使程式走到 else 部分。但是,這也帶來了一個問題:如果我定義的buffer 的長度為10,我發送的資料的長度也剛好為10,那麼,函數在用戶端不用Shutdown或Close的情況下,就已經走到了else 部分,然後 服務端的Socket 被 Close,等到用戶端使用 Shutdown()或Close() 的時候,服務端的串連 Socket 已經是不可用了,而這個時候調用 EndReceive 操作,會引發異常。所以,我認為在調用 EndReceive 前,先要判斷 Socket 是否可用。(這個結論尚未測試)同時,我測試將Socket.Shutdown(SocketShutdown.Send ),改為Socket.Shutdown(SocketShutdown.Receive ),並不能引發函數走到 else 部分,所以,我認為Socket 的Shutdown(SocketShutdown.Send )和Close()會引發用戶端與服務端的一次資料轉送。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.