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對象一直等待,直到將內部緩沖區的數據發送完為止。