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