




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、2022-3-301Socket網(wǎng)絡編程指導網(wǎng)絡編程指導2022-3-302什么是什么是Socket?BSD SocketBSD Socket(伯克立套接字)是通過標準的(伯克立套接字)是通過標準的UNIXUNIX文件文件描述符和其它程序通訊的一個方法,目前已經(jīng)被廣泛描述符和其它程序通訊的一個方法,目前已經(jīng)被廣泛移植到各個平臺。移植到各個平臺。SocketSocket是獨立于具體協(xié)議的網(wǎng)絡編程接口。在是獨立于具體協(xié)議的網(wǎng)絡編程接口。在ISOISO模型模型中,主要位于會話層和傳輸層。中,主要位于會話層和傳輸層。 2022-3-303Socket的類型的類型l流式套接字流式套接字(SOCK_STR
2、EAM) (SOCK_STREAM) 提供了一個面向連接,可靠的數(shù)據(jù)傳輸服務,數(shù)據(jù)無提供了一個面向連接,可靠的數(shù)據(jù)傳輸服務,數(shù)據(jù)無差錯,無重復的發(fā)送且按發(fā)送順序接收。內(nèi)設流量控制,差錯,無重復的發(fā)送且按發(fā)送順序接收。內(nèi)設流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無長度限制。避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無長度限制。l數(shù)據(jù)報式套接字數(shù)據(jù)報式套接字(SOCK_DGRAM) (SOCK_DGRAM) 提供了一個無連接服務。數(shù)據(jù)包以獨立包形式被發(fā)送,提供了一個無連接服務。數(shù)據(jù)包以獨立包形式被發(fā)送,不提供無差錯保證不提供無差錯保證, ,數(shù)據(jù)可能丟失或重復,并且接收順序數(shù)據(jù)可能丟失或重復,并且接
3、收順序無序。無序。l原始式套接字原始式套接字(SOCK_RAW) (SOCK_RAW) 該接口允許對較低層次協(xié)議,如該接口允許對較低層次協(xié)議,如IPIP、ICMPICMP直接訪問。直接訪問。2022-3-304 SocketSocket所在層次示意圖所在層次示意圖Application programStreamSocketInterfaceTCPUDPDatagramSocketInterfaceRawSocketInterfaceIPPhysical and data link layers2022-3-305基本套接字調(diào)用基本套接字調(diào)用創(chuàng)建套接字創(chuàng)建套接字socket(); socket
4、(); 綁定本機端口綁定本機端口bind(); bind(); 建立連接建立連接connect();connect();接受連接接受連接accept(); accept(); 監(jiān)聽端口監(jiān)聽端口listen(); listen(); 數(shù)據(jù)傳輸數(shù)據(jù)傳輸send(), recv() send(), recv() 等等; ; 關閉套接字關閉套接字close(); close(); 2022-3-306Socket相關的數(shù)據(jù)結(jié)構(gòu)相關的數(shù)據(jù)結(jié)構(gòu)lstruct sockaddr_in struct sockaddr_in short int sin_family; short int sin_family;
5、 / /* * 通信類型通信類型 * */ / unsigned short int sin_port; unsigned short int sin_port; / /* * 端口號端口號, ,網(wǎng)絡字節(jié)順序網(wǎng)絡字節(jié)順序* */ / struct in_addr sin_addr; /struct in_addr sin_addr; /* * Internet Internet 地址地址, ,網(wǎng)絡字節(jié)順序網(wǎng)絡字節(jié)順序* */ / unsigned char sin_zero8;unsigned char sin_zero8;/ /* *沒用沒用* */ / ; ; lstruct in_add
6、rstruct in_addr in_addr_t s_addr; /in_addr_t s_addr; /* * 存儲存儲32bit 32bit 的的IPIP地址地址* */ / 2022-3-307網(wǎng)絡字節(jié)順序和主機字節(jié)順序網(wǎng)絡字節(jié)順序和主機字節(jié)順序lBig-Endian Byte Order:Big-Endian Byte Order:字節(jié)的高位在內(nèi)存中放在存儲字節(jié)的高位在內(nèi)存中放在存儲單元的起始位置單元的起始位置Memoryl Little-Endian Byte Order : 與與Big-Endian相反相反AA+1A+2A+32022-3-308Host byte order(
7、Little-Endian )16-bit32-bitNetwork byte order(Big-Endian)16-bit32-bithtons()ntohs()htonl()ntohl()網(wǎng)絡字節(jié)順序和主機字節(jié)順序的轉(zhuǎn)換網(wǎng)絡字節(jié)順序和主機字節(jié)順序的轉(zhuǎn)換2022-3-309IP地址的轉(zhuǎn)換地址的轉(zhuǎn)換int inet_aton(const charint inet_aton(const char* * strptr, struct in_addr strptr, struct in_addr * *addrptr);addrptr); 從點狀十進制到從點狀十進制到3232位位2 2進制的轉(zhuǎn)換,
8、如進制的轉(zhuǎn)換,如“85” 85” 到到 ,char char * *inet_ntoa(struct in_addr inadd);inet_ntoa(struct in_addr inadd); 與與inet_aton()inet_aton()的功能相反的功能相反2022-3-3010相關的內(nèi)存操作函數(shù)相關的內(nèi)存操作函數(shù)void void * *memset(void memset(void * *buffer, int c, int count);buffer, int c, int count); 把把bufferbuffer所指內(nèi)存區(qū)域的前所
9、指內(nèi)存區(qū)域的前countcount個字節(jié)設置成字符個字節(jié)設置成字符c c。void void * *memcpy(void memcpy(void * *dest, void dest, void * *src, unsigned int src, unsigned int count); count); 由由srcsrc所指內(nèi)存區(qū)域復制所指內(nèi)存區(qū)域復制countcount個字節(jié)到個字節(jié)到destdest所指內(nèi)存所指內(nèi)存區(qū)域。區(qū)域。 Void bzero(void Void bzero(void * *s, int n );s, int n ); 置字節(jié)字符串置字節(jié)字符串s s的前的前n n個
10、字節(jié)為零。個字節(jié)為零。 2022-3-3011域名和域名和IP地址的轉(zhuǎn)換地址的轉(zhuǎn)換struct hostent struct hostent * *gethostbyname(const char gethostbyname(const char * *name); name); struct hostent char *h_name; /* 主機的官方域名主機的官方域名 */ char *h_aliases; /* 一個以一個以NULL結(jié)尾的主機別名數(shù)組結(jié)尾的主機別名數(shù)組 */ int h_addrtype; /* 返回的地址類型,在返回的地址類型,在Internet環(huán)境下為環(huán)境下為AF-
11、INET */ int h_length; /* 地址的字節(jié)長度地址的字節(jié)長度 */ char *h_addr_list; /* 一個以一個以0結(jié)尾的數(shù)組,包含該主機的所有地結(jié)尾的數(shù)組,包含該主機的所有地址址*/ ; #define h_addr h_addr_list0 /*在在h-addr-list中的第一個地址中的第一個地址*/ 2022-3-3012建立建立Socketl int socket(int domain, int type, int protocol); int socket(int domain, int type, int protocol);l參數(shù)說明:參數(shù)說明:do
12、maindomain:通信使用的協(xié)議族,即網(wǎng)絡的類型,對于:通信使用的協(xié)議族,即網(wǎng)絡的類型,對于 TCP/IPTCP/IP來說,是來說,是AF_INET AF_INET type: SOCK_STREAM / SOCK_DGRAM type: SOCK_STREAM / SOCK_DGRAM protocol: protocol: 通常為通常為0 0 返回整形的返回整形的socketsocket描述符,如果出錯,返回描述符,如果出錯,返回-1-1 2022-3-3013Socket的配置的配置lSocketSocket描述符是一個指向內(nèi)部數(shù)據(jù)結(jié)構(gòu)的指針,它指向描描述符是一個指向內(nèi)部數(shù)據(jù)結(jié)構(gòu)的指
13、針,它指向描述符表入口。調(diào)用述符表入口。調(diào)用Socket()Socket()函數(shù)時,將建立一個函數(shù)時,將建立一個SocketSocket,為一個為一個SocketSocket數(shù)據(jù)結(jié)構(gòu)分配存儲空間。數(shù)據(jù)結(jié)構(gòu)分配存儲空間。l兩個網(wǎng)絡程序之間的一個網(wǎng)絡連接包括五種信息:通信協(xié)兩個網(wǎng)絡程序之間的一個網(wǎng)絡連接包括五種信息:通信協(xié)議、本地主機地址和端口、遠端主機地址和端口。議、本地主機地址和端口、遠端主機地址和端口。l在使用在使用socketsocket進行網(wǎng)絡傳輸以前,必須配置該進行網(wǎng)絡傳輸以前,必須配置該socketsocket。面向連接的面向連接的socketsocket客戶端調(diào)用客戶端調(diào)用conn
14、ect()connect()函數(shù)在函數(shù)在socketsocket數(shù)據(jù)結(jié)構(gòu)中保存本地和遠端信息。數(shù)據(jù)結(jié)構(gòu)中保存本地和遠端信息。無連接無連接socketsocket的客戶端和服務端以及面向連接的客戶端和服務端以及面向連接socketsocket的服務端通過調(diào)用的服務端通過調(diào)用bind()bind()函數(shù)來配置本地信息。函數(shù)來配置本地信息。 2022-3-3014綁定綁定Socketlint bind(int sockfdint bind(int sockfd,struct sockaddr_in struct sockaddr_in * *my_addr, my_addr, int int add
15、rlen); addrlen); sockfd sockfd是是socket()socket()返回的返回的socketsocket描述符;描述符; my_addrmy_addr是指向包含本機是指向包含本機IPIP地址及端口號等信息的地址及端口號等信息的 sockaddrsockaddr類型的指針;類型的指針; addrlenaddrlen一般被設置為一般被設置為sizeof(struct sockaddr_in)sizeof(struct sockaddr_in)成功被調(diào)用時返回成功被調(diào)用時返回0 0;出現(xiàn)錯誤時返回;出現(xiàn)錯誤時返回-1-1 2022-3-3015綁定前綁定前sockaddr
16、_in的初始化的初始化my_addr.sin_family = AF_INET; /my_addr.sin_family = AF_INET; /選擇網(wǎng)絡類型為選擇網(wǎng)絡類型為TCP/IPTCP/IPmy_addr.sin_addr.s_addr = inet_addr(“22); my_addr.sin_addr.s_addr = inet_addr(“22); my_addr.sin_port = htons( 8888 ); /my_addr.sin_port = htons( 8888 ); /選擇端口選擇端口88888888addr_len
17、= sizeof(struct sockaddr_in); addr_len = sizeof(struct sockaddr_in); memset(&my_addr.sin_zero, 0, memset(&my_addr.sin_zero, 0, sizeof(my_addr.sin_zero);sizeof(my_addr.sin_zero); 2022-3-3016建立連接(客戶端)建立連接(客戶端)面向連接的客戶程序使用面向連接的客戶程序使用connectconnect函數(shù)來配置函數(shù)來配置socketsocket并與并與遠端服務器建立一個遠端服務器建立一個TCPTC
18、P連接,其函數(shù)原型為:連接,其函數(shù)原型為:int connect( int sockfd, struct sockaddr_in int connect( int sockfd, struct sockaddr_in * *serv_addrserv_addr,int addrlen);int addrlen); serv_addrserv_addr是包含遠端主機是包含遠端主機IPIP地址和端口號的指針;地址和端口號的指針;addrlenaddrlen是遠端地址結(jié)構(gòu)的長度是遠端地址結(jié)構(gòu)的長度 成功則返回成功則返回0 0,出現(xiàn)錯誤時返回,出現(xiàn)錯誤時返回-1-1 2022-3-3017建立連接(服
19、務器端)建立連接(服務器端)服務器監(jiān)聽端口:服務器監(jiān)聽端口:listenlisten函數(shù)使函數(shù)使socketsocket處于被動的監(jiān)聽模處于被動的監(jiān)聽模式,并為該式,并為該socketsocket建立一個輸入數(shù)據(jù)隊列,將到達的服務建立一個輸入數(shù)據(jù)隊列,將到達的服務請求保存在此隊列中,直到程序處理它們。請求保存在此隊列中,直到程序處理它們。 int listen(int sockfdint listen(int sockfd, int backlog);int backlog); backlogbacklog:請求連接隊列的最大長度請求連接隊列的最大長度成功返回成功返回0 0,出錯返回,出錯返回
20、-1-1 2022-3-3018建立連接(服務器端)建立連接(服務器端)accept()accept()函數(shù)讓服務器接收客戶的連接請求。在建立好輸函數(shù)讓服務器接收客戶的連接請求。在建立好輸入隊列后,服務器就調(diào)用入隊列后,服務器就調(diào)用acceptaccept函數(shù),然后睡眠并等待客函數(shù),然后睡眠并等待客戶的連接請求。戶的連接請求。int accept(int sockfd, sockaddr_in int accept(int sockfd, sockaddr_in * *addr, int addr, int * *addrlen);addrlen);addraddr是指向是指向sockaddr
21、_insockaddr_in變量的指針,該變量存放提出連變量的指針,該變量存放提出連接請求服務的主機的信息接請求服務的主機的信息 返回新的返回新的socketsocket描述符,和請求連接進程的地址聯(lián)系起來描述符,和請求連接進程的地址聯(lián)系起來在新的在新的socketsocket描述符上進行數(shù)據(jù)傳輸操作。原來的描述符上進行數(shù)據(jù)傳輸操作。原來的socketsocket繼續(xù)繼續(xù)listenlisten 2022-3-3019數(shù)據(jù)傳輸數(shù)據(jù)傳輸(1) send()send()和和recv()recv()這兩個函數(shù)用于面向連接的這兩個函數(shù)用于面向連接的socketsocket上進行上進行數(shù)據(jù)傳輸。數(shù)據(jù)傳輸
22、。 send()send()函數(shù)原型為:函數(shù)原型為: int send(int sockfd, const void int send(int sockfd, const void * *msg, int len, int msg, int len, int flags); flags); sockfd sockfd是用來傳輸數(shù)據(jù)的是用來傳輸數(shù)據(jù)的socketsocket描述符;描述符;msgmsg是指向是指向要發(fā)送數(shù)據(jù)的指針;要發(fā)送數(shù)據(jù)的指針;lenlen是以字節(jié)為單位的數(shù)據(jù)長度;是以字節(jié)為單位的數(shù)據(jù)長度;flagsflags一般置為一般置為0 0 send() send() 返回實際發(fā)送的
23、字節(jié)數(shù),可能會少于希望發(fā)送的返回實際發(fā)送的字節(jié)數(shù),可能會少于希望發(fā)送的數(shù)據(jù)。在程序中應該將數(shù)據(jù)。在程序中應該將send()send()的返回值與欲發(fā)送的字節(jié)數(shù)的返回值與欲發(fā)送的字節(jié)數(shù)進行比較。當返回值與進行比較。當返回值與lenlen不匹配時,應該進行處理。不匹配時,應該進行處理。 2022-3-3020數(shù)據(jù)傳輸數(shù)據(jù)傳輸(2) recv()recv()函數(shù)原型為:函數(shù)原型為: int recv(int sockfd, void int recv(int sockfd, void * *buf, int len, unsigned buf, int len, unsigned int int f
24、lags); flags); buf buf 是存放接收數(shù)據(jù)的緩沖區(qū);是存放接收數(shù)據(jù)的緩沖區(qū);lenlen是緩沖區(qū)的長度。是緩沖區(qū)的長度。flagsflags也被置為也被置為0 0。recv()recv()返回實際接收的字節(jié)數(shù),當出現(xiàn)錯誤時,返回返回實際接收的字節(jié)數(shù),當出現(xiàn)錯誤時,返回-1-12022-3-3021數(shù)據(jù)傳輸數(shù)據(jù)傳輸(3) sendto()sendto()和和recvfrom()recvfrom()用于在無連接的數(shù)據(jù)報用于在無連接的數(shù)據(jù)報socketsocket方方 式下進行數(shù)據(jù)傳輸。由于本地式下進行數(shù)據(jù)傳輸。由于本地socketsocket沒有與遠端機器建立沒有與遠端機器建立連
25、接,所以在發(fā)送數(shù)據(jù)時要指明目的地址。連接,所以在發(fā)送數(shù)據(jù)時要指明目的地址。 sendto()sendto()函數(shù)原型為:函數(shù)原型為: int sendto(int sockfd, const void int sendto(int sockfd, const void * *bufbuf,int int buflenbuflen,unsigned int flags, const unsigned int flags, const struct struct sockaddr_in sockaddr_in * *to, int to, int tolen);tolen); 2022-3-302
26、2數(shù)據(jù)傳輸數(shù)據(jù)傳輸(4) recvfrom()recvfrom()函數(shù)原型為:函數(shù)原型為: int recvfrom(int sockfdint recvfrom(int sockfd,void void * *bufbuf,int buflenint buflen, unsigned int flagsunsigned int flags,struct struct sockaddr_in sockaddr_in * *fromfrom,int int * *fromlen); fromlen); recvfrom()recvfrom()函數(shù)返回接收到的字節(jié)數(shù),當出錯時返回函數(shù)返回接收到的字
27、節(jié)數(shù),當出錯時返回-1-1 2022-3-3023結(jié)束傳輸結(jié)束傳輸 close()close()函數(shù)用于釋放函數(shù)用于釋放socketsocket,停止在該,停止在該socketsocket上的任何上的任何數(shù)據(jù)操作:數(shù)據(jù)操作: close(sockfd); close(sockfd); 也可以調(diào)用也可以調(diào)用shutdown() shutdown() 來關閉該來關閉該socketsocket該函數(shù)允許只停止某個方向上的數(shù)據(jù)傳輸,而一個方向上該函數(shù)允許只停止某個方向上的數(shù)據(jù)傳輸,而一個方向上的數(shù)據(jù)傳輸繼續(xù)進行。的數(shù)據(jù)傳輸繼續(xù)進行。 int shutdown(int sockfdint shutdow
28、n(int sockfd,int how); int how); 參數(shù)參數(shù) howhow允許為允許為shutdownshutdown操作選擇以下幾種方式:操作選擇以下幾種方式: 0-0-不允許繼續(xù)接收數(shù)據(jù)不允許繼續(xù)接收數(shù)據(jù) 1-1-不允許繼續(xù)發(fā)送數(shù)據(jù)不允許繼續(xù)發(fā)送數(shù)據(jù) 2-2-不允許繼續(xù)發(fā)送和接收數(shù)據(jù),不允許繼續(xù)發(fā)送和接收數(shù)據(jù), shutdownshutdown在操作成功時返回在操作成功時返回0 0,出錯時返回,出錯時返回-1-1。 2022-3-3024C/S結(jié)構(gòu)結(jié)構(gòu)服務器端要先啟動,提供相應服務器端要先啟動,提供相應服務:服務:1 1:打開一通信通道并告知本地:打開一通信通道并告知本地主機
29、,它愿意在某一個公認地址上主機,它愿意在某一個公認地址上接收客戶請求。接收客戶請求。2 2:等待客戶請求到達該端口。:等待客戶請求到達該端口。3 3:接收到服務請求,處理該請:接收到服務請求,處理該請求并發(fā)送應答信號。求并發(fā)送應答信號。4 4:返回第二步,等待另一客戶:返回第二步,等待另一客戶請求請求5 5:關閉服務器。:關閉服務器。客戶端:客戶端:1、打開一通信通道,、打開一通信通道,并連接到服務器所在主機的并連接到服務器所在主機的特定端口。特定端口。2、向服務器發(fā)送服務、向服務器發(fā)送服務請求報文,等待并接收應答;請求報文,等待并接收應答;繼續(xù)提出請求繼續(xù)提出請求3、請求結(jié)束后關閉通、請求結(jié)
30、束后關閉通信通道并終止。信通道并終止。 2022-3-3025流程圖流程圖TCP服務器端服務器端(循環(huán)服務器循環(huán)服務器)TCP客戶端客戶端socket( ) bind( ) listen( ) accept( ) socket( ) send( ) connect( ) recv( ) recv( ) send( ) close( ) close( ) UDP服務器端服務器端UDP客戶端客戶端socket( ) bind( ) listen( ) recvfrom( ) sendto( ) socket( ) bind( ) close( ) close( ) 2022-3-3026簡單的例子
31、簡單的例子int sockfd, newsockfd,addr_len, sendnum;int sockfd, newsockfd,addr_len, sendnum;struct sockaddr_in my_addr, their_addr;struct sockaddr_in my_addr, their_addr;char char * * msg = “welcome”; msg = “welcome”;sockfd = socket( AF_INET, SOCK_STREAM, 0 ); /sockfd = socket( AF_INET, SOCK_STREAM, 0 ); /
32、建立建立socketsocketmy_addr.sin_family = AF_INET; /my_addr.sin_family = AF_INET; /選擇網(wǎng)絡選擇網(wǎng)絡類型為類型為TCP/IPTCP/IPmy_addr.sin_addr.s_addr = inet_addr(“22);my_addr.sin_addr.s_addr = inet_addr(“22); my_addr.sin_port = htons( 8888 ); /my_addr.sin_port = htons( 8888 ); /選擇端口選擇端口88888888addr_
33、len = sizeof( struct sockaddr_in); addr_len = sizeof( struct sockaddr_in); memset(&my_addr.sin_zero, 0, sizeof(my_addr.sin_zero); memset(&my_addr.sin_zero, 0, sizeof(my_addr.sin_zero); bind(sockfd, (struct sockaddr bind(sockfd, (struct sockaddr * *)&my_addr, addr_len); /)&my_addr, ad
34、dr_len); /綁定綁定socketsocketlisten(sockfd,10); listen(sockfd,10); /監(jiān)聽,等待連接,等待連接隊列最大長度為監(jiān)聽,等待連接,等待連接隊列最大長度為10102022-3-3027簡單的例子(續(xù))簡單的例子(續(xù))While( 1 )While( 1 ) newsockfd = accept( sockfd, (struct sockaddr newsockfd = accept( sockfd, (struct sockaddr * *)&my_addr, addr_len);)&my_addr, addr_len); s
35、endnum = send(newsockfd, msg, strlen(msg)+1, 0); sendnum = send(newsockfd, msg, strlen(msg)+1, 0); close(newsockfd); close(newsockfd); close(sockfd); close(sockfd);2022-3-3028阻塞與非阻塞阻塞與非阻塞(1) l阻塞函數(shù):阻塞函數(shù):指其完成指定的任務之前不允許程指其完成指定的任務之前不允許程序調(diào)用另一個函數(shù),在序調(diào)用另一個函數(shù),在WindowsWindows下還會阻塞本線程下還會阻塞本線程消息的發(fā)送。消息的發(fā)送。 eg: r
36、ecv( ) ,eg: recv( ) ,當當socketsocket工作在阻塞模式的時候,如果工作在阻塞模式的時候,如果沒有數(shù)據(jù)的情況下調(diào)用該函數(shù),則當前線程會被掛起,直沒有數(shù)據(jù)的情況下調(diào)用該函數(shù),則當前線程會被掛起,直到有數(shù)據(jù)為止。到有數(shù)據(jù)為止。 l非阻塞函數(shù):非阻塞函數(shù):指操作啟動之后,如果可以立即指操作啟動之后,如果可以立即得到結(jié)果就返回結(jié)果,否則返回表示結(jié)果需要等待得到結(jié)果就返回結(jié)果,否則返回表示結(jié)果需要等待的錯誤信息,不等待任務完成函數(shù)就返回。的錯誤信息,不等待任務完成函數(shù)就返回。 2022-3-3029使用非阻塞使用非阻塞I/OI/O的方式:的方式:select()select(
37、)例子例子: :while(1)/while(1)/執(zhí)行循環(huán)執(zhí)行循環(huán) 一邊輸出一邊也不要忘了輸入一邊輸出一邊也不要忘了輸入FD_ZERO(&wt_set); FD_ZERO(&rd_set);FD_ZERO(&wt_set); FD_ZERO(&rd_set);FD_CLR(s,&wt_set); FD_CLR(s,&rd_set);FD_CLR(s,&wt_set); FD_CLR(s,&rd_set);FD_SET(s,&wt_set); FD_SET(s,&rd_set);FD_SET(s,&wt_s
38、et); FD_SET(s,&rd_set); timeout.tv_sec = 0; timeout.tv_sec = 0;timeout.tv_usec =500000;timeout.tv_usec =500000; z=select(s+1,&rd_set,&wt_set,NULL,&timeout); z=select(s+1,&rd_set,&wt_set,NULL,&timeout); if(FD_ISSET(s,&rd_set)/ if(FD_ISSET(s,&rd_set)/有數(shù)據(jù)可讀有數(shù)據(jù)可讀 z=re
39、cv(s,&recvBuff,sizeof recvBuff-1,0);z=recv(s,&recvBuff,sizeof recvBuff-1,0);2022-3-3030阻塞與非阻塞阻塞與非阻塞(2) 在在Berkeley socketBerkeley socket函數(shù)部分中,不涉及網(wǎng)絡函數(shù)部分中,不涉及網(wǎng)絡I/OI/O、本、本地端工作的函數(shù)是非阻塞函數(shù)地端工作的函數(shù)是非阻塞函數(shù)在在Berkeley socketBerkeley socket函數(shù)部分中,網(wǎng)絡函數(shù)部分中,網(wǎng)絡I/OI/O的函數(shù)是可的函數(shù)是可阻塞函數(shù),也就是它們可以阻塞執(zhí)行,也可以不阻塞阻塞函數(shù),也就是它們可以
40、阻塞執(zhí)行,也可以不阻塞執(zhí)行。這些函數(shù)都使用了一個執(zhí)行。這些函數(shù)都使用了一個socketsocket,如果它們使用,如果它們使用的的socketsocket是阻塞的,則這些函數(shù)是阻塞函數(shù);如果它是阻塞的,則這些函數(shù)是阻塞函數(shù);如果它們使用的們使用的socketsocket是非阻塞的,則這些函數(shù)是非阻塞函是非阻塞的,則這些函數(shù)是非阻塞函數(shù)。數(shù)。 2022-3-3031并發(fā)服務器并發(fā)服務器TCP服務器端服務器端(并發(fā)服務器并發(fā)服務器)socket( ) bind( ) listen( ) accept( ) send( ) recv( ) close( ) fork( ) /派生新進程派生新進程cl
41、ose( ) 主進程在主進程在accept之之后派生新進程,然后后派生新進程,然后主進程繼續(xù)主進程繼續(xù)listen,處處理新的連接請求理新的連接請求 新進程自行和客戶新進程自行和客戶端通信,新進程和主端通信,新進程和主進程搶占進程搶占CPU2022-3-3032WinSock APIWinSockWinSock是一個基于是一個基于SocketSocket模型的模型的APIAPI,在,在Microsoft WindowsMicrosoft Windows操作系統(tǒng)類中使用。操作系統(tǒng)類中使用。它在它在BerkeleyBerkeley接口函數(shù)的基礎之上,還增加了基于接口函數(shù)的基礎之上,還增加了基于消息
42、驅(qū)動機制的消息驅(qū)動機制的WindowsWindows擴展函數(shù)。擴展函數(shù)。Winscok1.1Winscok1.1只支持只支持TCP/IPTCP/IP網(wǎng)絡網(wǎng)絡,WinSock2.0,WinSock2.0增加了增加了對更多協(xié)議的支持。對更多協(xié)議的支持。 2022-3-3033Windows下的下的Socket編程編程(1) 和和linuxlinux下基本相同,需要包含下基本相同,需要包含winsock2.hwinsock2.h需要使用需要使用Ws_32.libWs_32.lib,可以用以下語句通告程序編,可以用以下語句通告程序編譯時調(diào)用該庫:譯時調(diào)用該庫: #pragma comment(lib,
43、Ws2_32.lib) ;#pragma comment(lib,Ws2_32.lib) ;WinSockWinSock以以DLLDLL的形式提供,在調(diào)用任何的形式提供,在調(diào)用任何WinSock WinSock APIAPI之前,必須調(diào)用函數(shù)之前,必須調(diào)用函數(shù)WSAStartup()WSAStartup()進行初始化,進行初始化,最后,調(diào)用函數(shù)最后,調(diào)用函數(shù)WSACleanUp()WSACleanUp()作清理工作。作清理工作。 2022-3-3034Windows下的下的Socket編程編程(2) WSADATA wsd;WSADATA wsd;/設置設置WINSOCKWINSOCK的版本的版本W(wǎng)ORD wVersionRequested=MAKEWORD(2,2);WORD wVersionRequested=MAKEWORD(2,2);WSAStartup(wVersionRequested,&wsd) ; WSAStartup(wVersionRequested,&wsd) ; /初始化初始化 。 WSACleanUp();WSACleanUp();2022-3-3035Windows下的下的Socket編程編程(3) MFCMFC提供了兩個類提供了兩個類CAsync
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年證件打印一體機項目合作計劃書
- 2025年中石化:石油腦項目合作計劃書
- 吧臺設備轉(zhuǎn)讓合同范例
- 影片拍攝投標合同范本
- 農(nóng)業(yè)技能培訓合同范本
- 司機水泥合同范例
- 合同范例新版正版
- 單位綠化施工合同范例
- LED戶外顯示屏廣告位租賃合同范本
- 個人購房合同范本簡易
- 煤礦安全質(zhì)量標準化培訓課件
- 2024解析:第十七章歐姆定律-基礎練(解析版)
- 【MOOC】電工電子學-浙江大學 中國大學慕課MOOC答案
- 新教材 人教版高中化學選擇性必修2全冊各章節(jié)學案(知識點考點精講及配套習題)
- (一模)長春市2025屆高三質(zhì)量監(jiān)測(一)生物試卷(含答案)
- DB35T 1036-2023 10kV及以下電力用戶業(yè)擴工程技術(shù)規(guī)范
- 《現(xiàn)代家政導論》電子教案 1.1模塊一項目一家政與家政學認知
- 《人工智能通識教程》(第2版)教學大綱
- 科研倫理與學術(shù)規(guī)范-期末考試答案
- 中國移動自智網(wǎng)絡白皮書(2024) 強化自智網(wǎng)絡價值引領加速邁進L4級新階段
- 2025屆高三聽力技巧指導-預讀、預測
評論
0/150
提交評論