網絡編程之TCP-IP socket編程
兩個網絡程序之間需要通信就需要在他們之間建立一個鏈接通道,這個通道就是由一個五元組組成。
五元組:(協議、本地IP地址、本地端口號、遠程IP地址、遠程端口號)
socket編程原理
socket套接口
網絡程序之間通信是依靠socket套接口進行通信。
例如:主機A上面的QQ程序需要發送消息到主機B上面的QQ,步驟就是:
①主機A上面的QQ發消息存到主機A上面的socket中
②這個socket通過主機A的網絡管理軟件通過網絡接口卡傳到主機B中得網絡接口卡
③主機B的網絡接口卡接收到消息后再傳給主機B的網絡管理軟件再傳到主機B的socket中。
④然后主機B中得QQ讀取socket中得信息
套接口分類
①流式套接口(SOCK_STREAM)可靠的面向連接的數據傳輸服務(適用于TCP)
②數據報套接口(SOCK_DGRAM)無連接不可靠的雙向數據傳輸服務(使用與UDP)
③原始套接口(SOCK_RAM)很少用
socket編程原理
①服務端調用socket()函數開啟一個服務,就是創建一個套接口
②這個socket條用bind()函數把一個端口跟這個socket綁定
③調用listen()函數監聽客戶端的請求
④客戶端也調用socket()函數穿件一個請求服務的套接口,然后調用connect()函數請求連接
⑤服務端調用accept()函數接收請求連接,然后使用recv()函數從套接口讀數據,調用send()函數向套接口發送數據
⑥關閉套接口資源#p#
winsock API套接口連接的建立
①WSAStartup()檢查協議棧的安裝情況
②socket()函數創建套接口socket
SOCKET socket ( int af,//地址族AF_INET int type,//套接口類型SOCK_STREAM(TCP),SOCK_DGRAM(UDP) int protocol//協議字段IPPROTO_TCP, IPPROTO_UDP )12345
③bind()綁定本地地址,就是把一個套接口與主機地址和端口號聯系起來。沒有錯誤返回0
int bind( SOCKET s,//套接口 const struct sockaddr FAR* name,//IP地址和端口地址 int namelen//地址參數的長度 )12345
關于地址參數
struct sockaddr_in { short sin_family;//必須是AF_INET u_short sin_port;//16位端口號 struct in_addr sin_addr;//IP地址 char sin_zero[8];//一般是0 }123456
④監聽連接 listen() 當一個套接口創建好后,然后綁定好,就該調用listen()函數監聽連接請求了,沒有錯誤返回0
int listen( SOCKET s,//已綁定了地址,還沒有建立連接的套接口 int backlog//指定正在等待連接的***隊列長度 )1234
⑤請求連接connect() 客戶端套接口創建好以后就可以調用這個函數進行連接
int connect( SOCKET s, const struct sockaddr FAR* name, int namelen )12345
⑥接收連接accept() 服務器接收客戶端的連接請求
SOCKET accept( SOCKET s,//處于監聽狀態的套接口 struct sockaddr FAR* addr,//用來存放發出連接的那個客戶端的IP地址信息 int FAR* addrlen//客戶端接口地址的長度 )12345
#p#
winsock API基本數據傳輸
TCP使用的數據傳輸函數
①send()函數,在已連接的套接口上發送數據
int send( SOCKET s,//已建立連接的套接口 const char FAR*buf,//字符緩沖區,內有將要發送的數據 int len,//即將發送的緩沖區的字符數 int flags//控制傳輸方式,可以是0 )123456
②recv()函數,從套接口接收數據
int recv( SOCKET s,//已建立的套接口 char FAR* buf,//用于接收數據的緩沖區 int len,//緩沖區的長度 int flags//調用方式 ,正常為0 )123456
UDP使用的數據傳輸函數
①recvfrom()接收數據
int recvfrom( SOCKET s,//一個套接口 char FAR* buf,//接收數據的緩沖區 int len,//緩沖區長度 int flags,//調用操作方式 struct sockaddr FAR* from//源地址,向誰要信息 int FAR* fromlen// )12345678
②sendto()發送數據
int sendto( SOCKET s,//套接口 const char FAR* buf,//將要發送數據的緩沖區 int len,//buf緩沖區長度 int flags,//調用方式 const struct sockaddr FAR* to,//目的套接口地址 int tolen//to所指地址長度 )12345678
#p#
winsock API連接與關閉套接口
①shutdown()關閉讀寫通道
shutdown( SOCKET s,//套接口 int how//關閉時禁止那種操作 )1234
②colsesocket()關閉套接口
int closesocket( SOCKET s )123
③WSACleanup()終止使用winsock
int WSACleanup();