IP連接領域有兩種通信類型:面嚮連接的(Connection-oriented)和無連接的(connectionless)。在面嚮連接的套接字中,使用TCP協議來建立兩個IP地址端之間的分話。一旦建立了這種連接,就可以在設備之間可靠地傳輸數據。為了建立面向連接的套接字,服務器和客戶端必須分別進行編程。

                   服務器                                     客戶機

                 Socket()                                   Socket()

                 Bind()                                      

                 Listen()

                 Accept() <-------------------       Connect()

                 Receive()  ------------------>      Send()

                 Send()     ------------------->    Receive()

                 Close()                                      Close()

      對於服務器端程序,建立套接字必須綁定到用於TCP通信的本地IP地址和端口上。Bind方法用於完成綁定械作

      Bind(IPEndPoint address) address為IPEndPoint實例包括一個本地IP地址和一個端口號。在套接字綁定到本地後,就用Listen方法等待客戶機連接的嘗試:

      Listen(int backlog)

      backlog參數指出系統等待用戶程序服務排隊的連接數,超過連接數的任務客戶都不能與服務器進行通信。

      在Listen方法執行之后,服務器已經做好了接收任務引進連接的准備,這是用Accept方法完成的。當有新客戶進行連接時,該方法就返回一個新的套接字描述符。下面是完成上述服務器端部分代碼的例字:

        IPHostEntry local = Dns.GetHostByName(Dns.GetHostByName());
        IPEndPoint ipport = new IPEndPoint(local.AddressList[0], 8000);
        Socket mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        mysocket.Bind(ipport);
        mysocket.Listen(10);
        Socket myClient = mysocket.Accept();

      程序執行到Accept方法時會處於暫停狀態,直到有客戶機請求連接,一旦有客戶機連接到服務器,myClient對象將包括與該客戶機通信的所 有連接信息。而mySocket對象仍然綁定到原來的IPEndPoint對象,並可以繼續用其他Accept方法新的客戶端連接。如果沒有調用其祂Accept方法,服務器就不會響應任務新的客戶機。在接受客戶機連接後,客戶機和服務器就可以開始傳遞數據了。

      

方法                                                             說明

Receive(byte[] data)                                           接收數據到指定的字節數組

Receive(byte[] data,SocketFlgs sf)                         接收數據到字節數組並設置套接字標志

Receive(byte[] data,int size,SocketFlgs sf)               接收指定容量數據到字節數組並設置套接字標志

Receive(byte[] data,int offset, int size,SocketFlgs sf) 接收從某處開始指定容量數據到字節數組並設置套接字標志

Send(byte[] data)                                                 發送字節數組中指定的數據

Send (byte[] data,SocketFlgs sf)                             發送數據到字節數組並設置套接字標志

Send (byte[] data,int size,SocketFlgs sf)                   發送指定容量數據到字節數組並設置套接字標志

Send (byte[] data,int offset, int size,SocketFlgs sf)     發送某處開始指定容量數據到字節數組並設置套接字標志

 

                            SocketFlag

DontRoute                                   不用內部路由表發送數據

MaxIOVectorLength                       給用於發送和接收數據 SWSABUF結構數提供一個標准值

None                                           對這次調用不使用標志

OutOfBind                                    處理帶外的數據

Partial                                         部分的發送或接收信息

Peek                                           只對進的信息取數

對於客戶端程序,客戶機也必須把一個地址綁定到創建的Socket對象,不過它不使用Bind方法,而是使用Connect方法:

       IPAddress remoteHost = IPAddress.Parse("192.168.0.1");
        IPEndPoint ipport = new IPEndPoint(remoteHost ,8000);
        Socket mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        mysocket.Connect(ipport);

在建立連接之前,不會執行Connect方法下面的語句。一旦建立連接,客戶機就可以象服務器使用的主法一樣,使用Send和Receive方法進行通信。注意通信完成後,必須先用ShutDown停止會話,然后關閉Socket實列。

               Socket.ShutDown

SocketShutDown.Both                         在套接字上既停止發送也停止接收

SocketShutDown.Receive                     防止套接字上接收數據,如果收到額外數據,將發出一個RST信號

SocketShutDown.Send                        防止套接字上發送數據,在所有存留在緩沖器中的數據發送出去之後,發出一個RST信號

下面是關閉連接的典型用法:

           sock.ShutDown(SocketShutDown.Both);

           sock.Close();

該方法允許Socket對象一直等待,直到將內部緩沖區的數據發送完為止。

posted on 2008-12-05 10:36  Blade  阅读(228)  评论(0编辑  收藏  举报