互聯(lián)網(wǎng)之移動(dòng)網(wǎng)絡(luò)編程復(fù)習(xí)_第1頁(yè)
互聯(lián)網(wǎng)之移動(dòng)網(wǎng)絡(luò)編程復(fù)習(xí)_第2頁(yè)
互聯(lián)網(wǎng)之移動(dòng)網(wǎng)絡(luò)編程復(fù)習(xí)_第3頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1、手機(jī)游戲簡(jiǎn)介及 TCP/IP網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)1)常用縮寫(xiě):什么叫 c/S、B/S、P2P ?C/S (Client客戶(hù)端/Server服務(wù)器)B/S (Browser 瀏覽器 /Server 服務(wù)器)P2P (Peer to Peer)2)TCP/IP網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)OSI (開(kāi)放系統(tǒng)互連)模型與 TCP/IP模型對(duì)比應(yīng)用層:該層負(fù)責(zé)實(shí)際的應(yīng)用程序細(xì)節(jié),包括FTP HTTPSMTP TELNET傳輸層:主要為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端的數(shù)據(jù)通 信。主要有TCP/UDP兩種傳輸模式。TCP/IP的核心部分是 傳輸層協(xié)議網(wǎng)絡(luò)層:負(fù)責(zé)主機(jī)間數(shù)據(jù)的路由和網(wǎng)絡(luò)上數(shù)據(jù)的存儲(chǔ),有IP/ICMP/AR

2、P/RARP。為 ICMP,TCP,UDP ( User Datagram Protocol用戶(hù)數(shù)據(jù)報(bào)協(xié)議)提供分組發(fā)送服務(wù)。鏈路層(網(wǎng)絡(luò)接口層):包括操作系統(tǒng)中的設(shè)備驅(qū)動(dòng)程序和 計(jì)算機(jī)中對(duì)應(yīng)的網(wǎng)卡,他們一起處理傳輸媒介的物理接口細(xì) 節(jié)。TCP ( Transmission Control Protocol 傳送控制協(xié)議)/IP 協(xié) 議:實(shí)際上就是在物聯(lián)網(wǎng)上的一組完整的網(wǎng)絡(luò)協(xié)議(TCP :提供傳輸層服務(wù),IP :提供網(wǎng)絡(luò)層服務(wù))2、Socket概述和TCP通信程序設(shè)計(jì)1、Socket 概述C/S通信模型一一不對(duì)稱(chēng)的模型TCP/IP模型TCP/IP協(xié)議的核心部分是傳輸層協(xié)議(TCP、UDP),網(wǎng)

3、絡(luò)層協(xié)議(IP)和物理接口層,這三層通常是在操作系統(tǒng)內(nèi)核中實(shí) 現(xiàn)。因此用戶(hù)一般不涉及。2、什么是套接字/套接口 (socket) ?套接字,是支持 TCP/IP的網(wǎng)絡(luò)通信的基本操作單元,可以 看做是不同主機(jī)之間的進(jìn)程進(jìn)行雙向通信的端點(diǎn),簡(jiǎn)單的說(shuō) 就是通信的兩方的一種約定,用套接字中的相關(guān)函數(shù)來(lái)完成 通信過(guò)程。從網(wǎng)絡(luò)整體來(lái)看,它是不同主機(jī)上應(yīng)用程序之間的一個(gè)虛擬 的接口,具有跨平臺(tái)特性。從程序員角度來(lái)看,它是應(yīng)用程序和網(wǎng)絡(luò)設(shè)備的一個(gè)接口,特殊的I/O3、Berkeley socket 和 WinSock 的不同 Berkeley socket 是一個(gè) int 數(shù)據(jù)類(lèi)型, Win SockSock

4、則是SOCKET數(shù)據(jù)類(lèi)型 WinSock 中以 SOCKET_ERROR 代表出錯(cuò),Berkeley Socket 以-1 代表出錯(cuò) WinSock應(yīng)用必須首先調(diào)用WSAStartup()初始 化,并在結(jié)束前調(diào)用 WSACIeanup()釋放資源,而B(niǎo)SD socket 不用。 WinSock使用closesocket中止一個(gè)連接,而B(niǎo)SDsocket 使用 close。4、Socket的分類(lèi)字節(jié)流套接字(Stream Sockets)面向連接的數(shù)據(jù)報(bào)套接字(Datagram Sockets)無(wú)連接的原始套接字(Raw Sockets)只對(duì)Internet協(xié)議有效,用于直接訪問(wèn)IP協(xié)議5、不同

5、操作系統(tǒng)中的 SocketWindows Socket(Winsock)Linux Socket(BSD Socket)Mac Socket(BSD Socket)BSD Socket :需要使用的頭文件一一數(shù)據(jù)類(lèi)型:#include <sys/types.h>函數(shù)定義:#include <sys/socket.h>6、IP地址與端口如果把IP數(shù)據(jù)包的投遞過(guò)程看成是給遠(yuǎn)方的一位朋友寄一 封信,那么IP地址就是這位朋友的所在位置,女口:廣州華軟學(xué)院游戲戲(依靠此信息進(jìn)行路由)端口號(hào)就是這位朋友的名字(依靠這個(gè)信息最終把這圭寸信交 付給這位收信)7、套接字的數(shù)據(jù)結(jié)構(gòu): 通用

6、的套接字地址結(jié)構(gòu)struct sockaddrunsigned short sa_family; / 地址家族char sa_data14; 14 字節(jié)協(xié)議地址;位于 sys/socket.h 文件中結(jié)構(gòu)中sa_family為套接字的協(xié)議族地址類(lèi)型, 例如對(duì)于通常 的TCP/IP協(xié)議(IPv4),它的值是 AF_INET; sa_data中存儲(chǔ)著 具體的協(xié)議地址,不同的協(xié)議族有不同的地址格式。sa_data的存儲(chǔ)內(nèi)容往往是包含地址和端口信息,而僅使用一個(gè)變量,所以使用起來(lái)不太方便。 Sockaddr結(jié)構(gòu)的并列形式struct sockaddr_inshort int sin_family;/

7、通信類(lèi)型unsigned short int sin_port;/端口,2 bytesstruct in addr sin_addr; /Internet 地址,4 bytesunsigned char sin_zero8;;/填充的空白信息,這樣就保持整個(gè)結(jié)構(gòu)與sockaddr結(jié)構(gòu)的長(zhǎng)度相同;其中,in_addr結(jié)構(gòu)定義如下:struct?in_addr?unsigned long?s_addr?;/*s_addr 必須是網(wǎng)絡(luò)字節(jié)順序?Network?Byte?Order */備注:sockaddr只是一個(gè)抽象的概述形式,并不實(shí)用。sockaddr_in更加結(jié)合了 TCP/IP協(xié)議族的特點(diǎn),

8、易于使用, 所以編程中常使用這個(gè)結(jié)構(gòu)。但是:socket本身所圭寸裝的 API都是支持sockaddr結(jié)構(gòu)的, 所以填充sockaddr_in結(jié)構(gòu)需要強(qiáng)制轉(zhuǎn)換成 sockaddr結(jié)構(gòu), 方可作為參數(shù)被socket的標(biāo)準(zhǔn)函數(shù)所使用。&字節(jié)順序主機(jī)字節(jié)順序(Host Byte Order)低位在前,高位在后(little-endian)基于Intel芯片的機(jī)器采取這種存儲(chǔ)方式網(wǎng)絡(luò)字節(jié)順序(Network Byte Order)高位在前,低位在后 (big-endian)sockaddr_in的變量成員(端口和地址)都必須使用網(wǎng)絡(luò)字節(jié)順 序9、轉(zhuǎn)換字節(jié)順序的函數(shù)10將IP地址轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順

9、序inet_addrunsigned long inet_addr(const char *cp);sockaddr_in 的socket.將需要通信的IP地址轉(zhuǎn)化為整數(shù),并填充 sin_addr 成員inet_ntoachar * inet_ntoa(struct in_addr in);例如將0A00A8C0轉(zhuǎn)化為“”11、TCP網(wǎng)絡(luò)通訊編程創(chuàng)建一個(gè)被動(dòng)模式(server,服務(wù)器)的建立應(yīng)用層的連接Client/Server 交互在發(fā)送和接收數(shù)據(jù)之前client必須調(diào)用 connect連接服務(wù)器 server 必須調(diào)用 accept 接收 client的連接 發(fā)送和接收數(shù)據(jù).關(guān)閉連接.12

10、、網(wǎng)絡(luò)連接函數(shù):socket創(chuàng)建套接字 connect 建立連接 bind 綁定本機(jī)端口 listen 監(jiān)聽(tīng)端口 accept 接受連接 recv, recvfrom數(shù)據(jù)接收send, sendto 數(shù)據(jù)發(fā)送close, shutdown 關(guān)閉套接字13、TCP客戶(hù)服務(wù)器通信機(jī)制14基本套接字函數(shù)-socket()基本套接字函數(shù)(2)- connect。基本套接字函數(shù)(2)-例子int fd;/*套接字描述符*/struct sockaddr_in srv; /* 套接字地址結(jié)構(gòu)*/*創(chuàng)建socket,調(diào)用函數(shù)socket,語(yǔ)句同前面socket的例子*/ srv.sin_family = A

11、F_INET; /* connect: AF_INET 表示使用 Internet 地址族 */srv.sin_port = htons(8000);/* connect:目標(biāo)是連向服務(wù)器的8000 號(hào)端口 */= inet_addr( “” );/* connect:目標(biāo)服務(wù)器的 IP Address 是 “”*/if(connect(fd, (struct sockaddr*) & srv, sizeof(srv) < 0) fprintf(stderr, ” connect error!n");exit(1);基本套接字函數(shù)(3)- bind()基本套接字函數(shù)(3

12、)-例子int fd;/*套接字描述符*/struct sockaddr_in srv; /* 套接字地址結(jié)構(gòu)*/*創(chuàng)建socket,調(diào)用函數(shù)socket,語(yǔ)句同前面socket的例子*/ srv.sin_family = AF_INET; /* AF_INET 表示使用 Internet 地 址族*/srv.sin_port = htons(80); /* 將 socket 綁定到 80 號(hào)端口 = htonl(INADDR_ANY);/* bind:INADDR_ANY表示服務(wù)器將接收來(lái)自本機(jī)上任何一塊網(wǎng)卡的客戶(hù)連接 */if(bind(fd, (struct sockaddr*) &am

13、p;srv, sizeof(srv) < 0) fprintf(stderr, ” bind error!n");exit(1);基本套接字函數(shù)(4)- listen()基本套接字函數(shù)(4)-例子int fd;/*套接字描述符*/struct sockaddr_in srv; /* used by bind() */* 1) create the socket */* 2) bind the socket to a port */if(listen(fd, 20) < 0) fprintf(stderr, ” listen error!n");exit(1);基

14、本套接字函數(shù)(5)- accept()基本套接字函數(shù)(5)-例子struct sockaddr_in cli; /* used by accept() */int newfd;/*用來(lái)存放accept返回的新的套接字*/int cli_len = sizeof(cli); /* used by accept() */* 1) create the socket */* 2) bind the socket to a port */* 3) listen on the socket */newfd = accept(fd, (struct sockaddr*) &cli, &cl

15、i_len);if(newfd < 0) fprintf(stderr, "accept error'n");exit(1);包含了客戶(hù)的IP 地址cli.sin_port包含了客戶(hù)的 端口數(shù)其他需要用到的函數(shù)int read( int fd, char *buf, int len);返回實(shí)際接收的緩沖區(qū)大小int write(int fd, char *buf, int len);返回實(shí)際發(fā)送的緩沖區(qū)大小int close(int sockfd);成功返回0,否則返回-1recv ()函數(shù)int recv (SOCKET s,char* bytesToRec

16、eive,int nBytes,int flags);s是已經(jīng)連接的 SocketbytesToReceive指向用于接收數(shù)據(jù)的緩沖區(qū)的指針 nBytes是緩沖區(qū)的字節(jié)數(shù)flags0, MSG_DONTROUTE, or MSG_OOB當(dāng)調(diào)用成功,recv()返回被接收的字節(jié)數(shù); 如果返回0,則 說(shuō)明連接已經(jīng)被關(guān)閉;當(dāng)調(diào)用失敗,返回 SOCKET_ERROR。注意:recv()并不保證接收到所有請(qǐng)求的數(shù)據(jù)。 它實(shí)際接收的 字節(jié)數(shù)由返回值指示。也許需要循環(huán)調(diào)用recv()來(lái)得到需要的結(jié)果。recv()的典型用法#define BUFSIZE 1024SOCKET s;char bufBUFSIZ

17、E; / 緩沖區(qū)int bytesRecv;/創(chuàng)建socket并連接服務(wù)器/ .bytesRecv = recv(s, buf, BUFSIZE, 0);if( bytesRecv = SOCKET_ERROR )printf("recv()調(diào)用錯(cuò)誤:%d", WSAGetLastError();else if(bytesRecv = 0)printf("對(duì)方已經(jīng)關(guān)閉連接.");closesocket(s);else/處理緩沖區(qū)的數(shù)據(jù)send ()函數(shù)int send (SOCKET s,const char* bytesToSend,int nByte

18、s,int flags);s是已經(jīng)連接的 SocketbytesToSend指向待發(fā)送數(shù)據(jù)緩沖區(qū)的指針nBytes是待發(fā)送數(shù)據(jù)的字節(jié)數(shù)flags指定調(diào)用方式。常用0注意:send()并不保證發(fā)送所有請(qǐng)求的數(shù)據(jù)。它實(shí)際發(fā)送的 字節(jié)數(shù)由返回值指示。也許需要循環(huán)調(diào)用send()來(lái)得到需要的結(jié)果。close ()函數(shù)15 BSD socket 與 winsocket 創(chuàng)建區(qū)別/ Berkeley 形式int socket(int family , int type, int protocol);/ WinSock 形式SOCKET socket (int family, int type, int p

19、rotocol);第三周:UDP網(wǎng)絡(luò)通訊及其它 socket函數(shù)1、無(wú)連接UDP協(xié)議的Socket調(diào)用client/server UDP 通信基本套接口函數(shù)(7)與TCP不同的是,UDP在通信時(shí),系統(tǒng)內(nèi)部不記錄套接口地址信息,都是函數(shù)中主動(dòng)以參數(shù)的形式指明的.在TCP情況下,客戶(hù)connect成功后(服務(wù)器accept成功后),每次發(fā)送接 收都只需指定套接口描述符就行了,但是這里每次發(fā)送接收都需要額外附加上對(duì)方的套接口地址信息.初始-建立socketint fd; /*套接口描述符 */if(fd = socket(AFNET, SOCK_DGRAM, 0) < 0) perror( “

20、 socket” );exit(1);/*建立socket,與TCP類(lèi)似*/服務(wù)器和客戶(hù)端bind服務(wù)器和客戶(hù)端recvfrom服務(wù)器和客戶(hù)端sendto2、其它常用socket api函數(shù) gethostname() 從域名解析得到 IP地址(gethostbyname) inet_ntop 及 inet_pton3、阻塞阻塞模式:是socket的缺省方式,也是最常用的方式,即調(diào) 用結(jié)果返回之前,函數(shù)阻塞,當(dāng)前線(xiàn)程會(huì)被掛起,suspend??赡茉斐勺枞暮瘮?shù)有:connect。、accept()、讀寫(xiě)函數(shù)、gethostbynam e()等。4、再探 send 和 recvsend和recv

21、是socket編程中兩個(gè)核心的函數(shù)。send表示發(fā)送數(shù)據(jù),其實(shí)際上比不是直接將數(shù)據(jù)發(fā)送出去,而是將數(shù)據(jù)先發(fā)送到系統(tǒng)對(duì)應(yīng)的socket的緩沖區(qū),在由系統(tǒng)使用tcpip協(xié)議進(jìn)行發(fā)送。此時(shí)send返回的結(jié)果只 是表明是否成功發(fā)送到系統(tǒng)的緩沖區(qū)。同樣recv函數(shù)也是從系統(tǒng)的對(duì)應(yīng)的socket緩沖區(qū)讀取數(shù)據(jù),而該緩沖區(qū)中的數(shù)據(jù)也是由協(xié)議保證的。 如果該緩沖 區(qū)沒(méi)有數(shù)據(jù),將區(qū)別對(duì)待:如果對(duì)應(yīng)的 socket是阻塞的, 則recv工作在阻塞模式,將一直等到緩沖區(qū)中有數(shù)據(jù)才 返回,否則會(huì)一直掛起。5、非阻塞模式非阻塞和阻塞的概念相對(duì)應(yīng),指在不能立刻得到結(jié)果之前,該函數(shù)不會(huì)阻塞當(dāng)前線(xiàn)程,而會(huì)立刻返回。如果指定非

22、阻塞模式,程序調(diào)用可能造成阻塞的函數(shù)時(shí),如果會(huì)發(fā)生阻塞,這些函數(shù)返回-1并將errno設(shè)置為EAGAIN 或EWOULDBLOCK ,程序可繼續(xù)向下運(yùn)行。可能阻塞的函數(shù)對(duì)應(yīng)的任務(wù)完成,則再次調(diào)用該函數(shù)時(shí)就返 回0表示運(yùn)行結(jié)束。第四周:并發(fā)服務(wù)器與多進(jìn)程1、知識(shí)回顧TCP:傳輸控制協(xié)議TCP是一種面向連接的、可靠的、基于 字節(jié)流的傳輸層通信協(xié)議。2、面向連接的C/S程序工作流程(TCP)服務(wù)器端工作流程使用socket()函數(shù)創(chuàng)建服務(wù)器端通信套接口使用bind()函數(shù)將創(chuàng)建的套接口與服務(wù)器地址綁定使用listen()函數(shù)使服務(wù)器套接口做好接收連接請(qǐng)求準(zhǔn)備使用accept()接收來(lái)自客戶(hù)端由con

23、nect。函數(shù)發(fā)出的連接請(qǐng) 求根據(jù)連接請(qǐng)求建立連接后,使用send()函數(shù)發(fā)送數(shù)據(jù),或者使用recv()函數(shù)接收數(shù)據(jù)使用close ()函數(shù)關(guān)閉套接口 (可以先用shutdown。函數(shù)先關(guān) 閉讀寫(xiě)通道)客戶(hù)端程序工作流程使用socket()函數(shù)創(chuàng)建客戶(hù)端套接口使用connect()函數(shù)發(fā)出也服務(wù)器建立連接的請(qǐng)求(調(diào)用前可以不用bind()端口號(hào),由系統(tǒng)自動(dòng)完成連接建立后使用send()函數(shù)發(fā)送數(shù)據(jù),或使用recv()函數(shù)接收 數(shù)據(jù)使用close()函數(shù)關(guān)閉套接口3、UDP協(xié)議用戶(hù)數(shù)據(jù)報(bào)協(xié)議(UDP )是ISO參考模型中一種無(wú)連接的 傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)。與TCP不同

24、,UDP并不提供對(duì)IP協(xié)議的可靠機(jī)制、流控制以 及錯(cuò)誤恢復(fù)功能等。由于 UDP比較簡(jiǎn)單,UDP頭包含很 少的字節(jié),比TCP負(fù)載消耗少。UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境。提供高效率服務(wù);如果自己完成安全性檢查,UDP 也可用于大型文件的傳輸。4、無(wú)連接UDP協(xié)議的Socket調(diào)用client/server UDP 通信5、無(wú)連接的C/S程序工作流程(UDP)無(wú)連接的數(shù)據(jù)報(bào)傳輸服務(wù)通信時(shí),客戶(hù)端與服務(wù)器端所使用的函數(shù)是類(lèi)似的,其工作流程如下:使用socket()函數(shù)創(chuàng)建套接口,以確定協(xié)議類(lèi)型調(diào)用bind()函數(shù)將創(chuàng)建的套接口與本地地址綁定,確定本地地址和本地端口號(hào)使用se

25、ndto()函數(shù)發(fā)送數(shù)據(jù),或者使用recvfrom()函數(shù)接收數(shù)據(jù)使用close ()函數(shù)關(guān)閉套接口6、并發(fā)服務(wù)器按連接類(lèi)型分類(lèi)并發(fā)無(wú)連接服務(wù)器并發(fā)連接服務(wù)器按并發(fā)技術(shù)分類(lèi)多進(jìn)程多線(xiàn)程10多路復(fù)用7、單進(jìn)程非阻塞并發(fā)服務(wù)器Objective_C常用容器NSArray?用于對(duì)象有序集合(相當(dāng)于是數(shù)組)NSSet?用于對(duì)象無(wú)序集合NSDictionary用于鍵值映射以上三種集合類(lèi)是不可變的(一旦初始化后,就不能改變)以下是對(duì)應(yīng)的三種可變集合類(lèi)(這三種可變集合類(lèi)是對(duì)應(yīng)上 面三 種集合類(lèi) 的 子類(lèi) ):NSMutableArray ?NSMutableSet ?NSMutableDictionary注

26、:這些集合類(lèi)只能收集 cocoa對(duì)象(NSOjbect對(duì)象),如 果想保存一些原始的C數(shù)據(jù)(例如,int, float, double, BOOL 等),則需要將這些原始的C數(shù)據(jù)圭寸裝成NSNumber類(lèi)型 的,NSNumber對(duì)象是 cocoa對(duì)象,可以被保存在集合類(lèi)中。&關(guān)于阻塞的問(wèn)題阻塞:是指一個(gè)線(xiàn)程執(zhí)行了一個(gè)函數(shù)或者系統(tǒng)調(diào)用,該函數(shù) 由于某種原因不能立即完成,因而不能返回調(diào)用它的線(xiàn) 程,導(dǎo)致線(xiàn)程受控于這個(gè)函數(shù)而處于等待掛起的狀態(tài), 線(xiàn)程的這種狀態(tài)稱(chēng)為阻塞。9、能引起阻塞的套接字調(diào)用在Berkeley套接字網(wǎng)絡(luò)編程接口的模型中,套接字的默認(rèn)行為是阻塞的,具體地說(shuō),在一定情況下,有

27、多個(gè)操作套 接字的系統(tǒng)調(diào)用會(huì)引起進(jìn)程阻塞。(1 ) accept。(2 ) read()、recv()和 recvfrom()(3 ) write() 、send()和 sendto()(4 ) connect。(5 ) select()(6 ) close()10服務(wù)器實(shí)現(xiàn)非阻塞套接字設(shè)置(fcntl )1、獲取文件的flags:? flags = fcntl(fd,F_GETFL,O);2、設(shè)置文件的flags:?fcntl(fd,F_SETFL,flags);3、增加文件的某個(gè)flags,比如文件是阻塞的,想設(shè)置成非 阻塞:? flags = fcntl(fd,F_GETFL,0);?

28、flags |= O_NONBLOCK; ?fcntl(fd,F_SETFL,flags);4、取消文件的某個(gè)flags,比如文件是非阻塞的,想設(shè)置成 為阻塞:?flags = fcntl(fd,F_GETFL,0);?flags &=O_NONBLOCK;? fcntl(fd,F_SETFL,flags);也可調(diào)用ioctl調(diào)用實(shí)現(xiàn)非阻塞設(shè)置服務(wù)器實(shí)現(xiàn)非阻塞fcntl例子int flags;if(flags = fcntl(socketListen,F_GETFL,0)=-1)perror("fcntl F_GETFL fail:");exit(1);flags

29、|= O_NONBLOCK;if(fcntl(socketListen,F_SETFL,flags)=-1)perror("fcntl F_SETFL fail:");exit(1);服務(wù)器實(shí)現(xiàn)非阻塞recv收到消息例子NSMutableSet *remove = NSMutableSet alloc init;?for (NSNumber* obj in sClientSet)char newMsgMSGSIZE;memset(newMsg,O,MSGSIZE);int intSocket=obj intValue;/調(diào)用recv接收到客戶(hù)端的消息int nLen=rec

30、v(intSocket,newMsg,MSGSIZE,0);if(nLen>0) newMsgnLen='O'printf(” 接收到 %d:%srn",intSocket,newMsg);11、多進(jìn)程并發(fā)執(zhí)行的服務(wù)器程序fork()函數(shù):pid_t fork()功能:創(chuàng)建一個(gè)新的進(jìn)程.說(shuō)明:本系統(tǒng)調(diào)用產(chǎn)生一個(gè)新的進(jìn)程,叫子進(jìn)程,是調(diào)用進(jìn)程的一個(gè)復(fù)制品。調(diào)用進(jìn)程叫父進(jìn)程,子進(jìn)程繼承了父進(jìn)程的幾乎所有的屬性。返回值:調(diào)用成功則對(duì)子進(jìn)程返回 0,對(duì)父進(jìn)程返回子進(jìn)程號(hào),這也是最方便的區(qū)分父子進(jìn)程的方法.若調(diào)用失敗則返回-1給父進(jìn)程,子進(jìn)程不生成.利用UNIX操作系統(tǒng)的

31、fork()系統(tǒng)調(diào)用,編制多進(jìn)程并發(fā)執(zhí)行 的服務(wù)器程序,可以創(chuàng)建子進(jìn)程。對(duì)每一個(gè)客戶(hù)端,用一個(gè)專(zhuān)門(mén)的進(jìn)程為它服務(wù),通過(guò)進(jìn)程的并發(fā)執(zhí)行,來(lái)對(duì)實(shí)現(xiàn)多個(gè)客戶(hù)的并發(fā)服務(wù).基本的編程框架是:父進(jìn)程代碼If (pid = fork() = 0) 子進(jìn)程代碼 else if (pid<0) 報(bào)錯(cuò)信息父進(jìn)程代碼12、多進(jìn)程并發(fā)執(zhí)行的服務(wù)器程序 #import <Foundation/Foundation.h>/* basic system data types/* basic socket definitions/* sockaddr_in and other/* inet(3) funct

32、ions */#import <sys/types.h>#import <sys/socket.h>#import <netinet/in.h> Internet defns */#import <arpa/inet.h> ?#define MAXLINE 1024 ?void handle(int connfd);int main (int argc, const char * argv) NSAutoreleasePool * pool = NSAutoreleasePoolinit;/ insert code here.NSLog(&quo

33、t;Hello, World!"); int listenfd, connfd; int serverPort = 8000; int listenq = 1024; pid_t childpid;char bufMAXLINE;socklen_t socklen;struct sockaddr_in cliaddr, servaddr;socklen = sizeof(cliaddr);bzer o(&servaddr, sizeof(servaddr);servaddr.sin_family = AF_INET;servaddr.sin_port = htons(serverPort);乙listenfd = socket(AFN ET, SOCK_STREAM, 0);if (listenfd < 0) perror("socket error");return -1;if (bind(listenfd, (struct sockaddr *) &servaddr, socklen)< 0) perror("bind error");return -1;if (listen(listenfd, listenq

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論