freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux程序設(shè)計(jì)__技術(shù)技巧與項(xiàng)目實(shí)踐---網(wǎng)絡(luò)編程--第9章-在線瀏覽

2025-02-11 15:09本頁面
  

【正文】 char x0,x1。 ? x0=((char*)x)[0]。 //高地址單元 ? 若 x0=0x11,則是大端 。 3/23/2023 8 socket的連接建立 ? 面向連接的客戶程序使用 connect函數(shù)來配置 socket并與遠(yuǎn)端服務(wù)器建立一個(gè) TCP連接,其函數(shù)原型為: ? int connect(int sockfd, struct sockaddr *serv_addr,int addrlen)。 Connect( )函數(shù)在出現(xiàn)錯(cuò)誤時(shí)返回 1,并設(shè)置 errno為相應(yīng)的錯(cuò)誤碼。 ? connect函數(shù)啟動(dòng)和遠(yuǎn)端主機(jī)的直接連接。無連接協(xié)議從不建立直接連接。 ? listen( )函數(shù)使 socket處于被動(dòng)監(jiān)聽模式,并為該 socket建立輸入數(shù)據(jù)隊(duì)列,將到達(dá)的服務(wù)請(qǐng)求保存在此隊(duì)列中,直到程序處理它們。 3/23/2023 9 ? Sockfd依然是 socket系統(tǒng)調(diào)用返回的 socket 描述符; backlog指定在請(qǐng)求隊(duì)列中允許的最大請(qǐng)求數(shù),進(jìn)入的連接請(qǐng)求將在隊(duì)列中等待accept( )接收它們。如果一個(gè)服務(wù)請(qǐng)求到來時(shí),輸入隊(duì)列已滿,該 socket將拒絕連接請(qǐng)求,客戶將收到一個(gè)出錯(cuò)信息。 ? accept()函數(shù)讓服務(wù)器接收客戶的連接請(qǐng)求。該函數(shù)的原型是: ? int accept(int sockfd, void *addr, int *addrlen)。出現(xiàn)錯(cuò)誤時(shí) accept函數(shù)返回 1并置相應(yīng)的 errno值。 3/23/2023 10 數(shù)據(jù)傳輸 ? send( )和 recv( )這兩個(gè)函數(shù)用于面向連接的 socket上進(jìn)行數(shù)據(jù)傳輸。 ? Sockfd是用來傳輸數(shù)據(jù)的 socket描述符; msg是一個(gè)指向要發(fā)送數(shù)據(jù)的指針; len是以字節(jié)為單位的數(shù)據(jù)長度; flags一般情況下置為 0。在程序中應(yīng)該將 send( )的返回值與欲發(fā)送的字節(jié)數(shù)進(jìn)行比較。 ? char *msg = Hello!。 ? …… ? len = strlen(msg)。 ? …… ? recv()函數(shù)原型為: ? int recv(int sockfd,void *buf,int len,unsigned int flags)。 Flags也被置為 0。 Sendto( )和 recvfrom( )用于在無連接的數(shù)據(jù)報(bào)socket方式下進(jìn)行的數(shù)據(jù)傳輸。 ? sendto()函數(shù)原型為: ? int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen)。Sendto函數(shù)也返回實(shí)際發(fā)送的數(shù)據(jù)字節(jié)長度或在出現(xiàn)發(fā)送錯(cuò)誤時(shí)返回 1。 ? 其中的 from是一個(gè) struct sockaddr類型的變量,該變量保存源機(jī)的 IP地址及端口號(hào)。當(dāng) recvfrom( )返回時(shí), fromlen包含實(shí)際存入from中的數(shù)據(jù)字節(jié)數(shù)。 ? 如果對(duì)數(shù)據(jù)報(bào) socket調(diào)用 connect()函數(shù),可以利用 send( )和 recv( )進(jìn)行數(shù)據(jù)傳輸,但該 socket仍然是數(shù)據(jù)報(bào) socket,利用傳輸層 UDP服務(wù)。當(dāng)所有的數(shù)據(jù)操作結(jié)束后,可以調(diào)用 close( )函數(shù)釋放該 socket,停止在該 socket上的任何數(shù)據(jù)操作: ? close(sockfd)。該函數(shù)允許只停止在某個(gè)方向上的數(shù)據(jù)傳輸,而其它方向上的數(shù)據(jù)傳輸還會(huì)繼續(xù)進(jìn)行。 ? int shutdown(int sockfd,int how)。參數(shù) how允許為 shutdown操作選擇以下幾種方式: 0不允許繼續(xù)接收數(shù)據(jù); 1不允許繼續(xù)發(fā)送數(shù)據(jù); 2不允許繼續(xù)發(fā)送和接收數(shù)據(jù);均為允許則調(diào)用 close ( ) 。 3/23/2023 14 Socket編程實(shí)例 ? 在下面的實(shí)例中,服務(wù)器將通過 socket連接向客戶端發(fā)送字符串“ Hello, you are connected!”。服務(wù)器端的軟件 : ? include ? include ? include ? include ? include sys/ ? include i/ ? include sys/ ? include sys/ ? define SERVPORT 3333 /*服務(wù)器監(jiān)聽端口號(hào) */ ? define BACKLOG 10 /* 最大同時(shí)連接請(qǐng)求數(shù) */ 3/23/2023 15 ? main() ? { ? int sockfd,client_fd。 /* 本機(jī)地址信息 */ ? struct sockaddr_in remote_addr。 exit(1)。 ? =htons(SERVPORT)。 ? bzero( (),8)。 ? exit(1)。 ? exit(1)。 ? if ((client_fd = accept(sockfd, (struct sockaddr *) remote_addr, sin_size)) == 1) { ? perror( accept出錯(cuò) )。 } ? printf( received a connection from %s\n, i_ntoa())。 ? close(client_fd)。 ? } ? close(client_fd)。服務(wù)器顯示該客戶機(jī)的 IP地址,并通過新的 socket向客戶端發(fā)送字符串“ Hello, you are connected!”,最后關(guān)閉該 socket。所以包含 fork函數(shù)的 if語句是子進(jìn)程代碼部分,它與 if語句后面的父進(jìn)程代碼部分是并發(fā)執(zhí)行的。 ? char buf[MAXDATASIZE]。 ? struct sockaddr_in serv_addr。s hostname!\n)。 ? } 3/23/2023 19 ? if((host=gethostbyname(argv[1]))==NULL) { ? herror(gethostbyname出錯(cuò)! )。 ? } ? if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == 1){ ? perror(socket創(chuàng)建出錯(cuò)! )。 ? } ? =AF_INET。 ? = *((struct in_addr *)host h_addr)。 ? if (connect(sockfd, (struct sockaddr *) serv_addr, \ ? sizeof(struct sockaddr)) == 1) { ? perror(connect出錯(cuò)! )。 ? } 3/23/2023 20 ? if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==1) { ? perror(recv出錯(cuò)! )。 ? } ? buf[recvbytes] = 39。 ? printf( Received: %s,buf)。 ? } ? 客戶端程序首先通過服務(wù)器域名獲得服務(wù)器的 IP,然后創(chuàng)建一個(gè)socket,調(diào)用 connect函數(shù)與服務(wù)器建立連接,連接成功之后接收從服務(wù)器發(fā)送來的數(shù)據(jù),最后關(guān)閉 socket。由于 IP地址難以記憶和讀寫,所以為了方便,人們常常用域名來表示主機(jī),這就需要進(jìn)行域名和 IP地址的轉(zhuǎn)換。 3/23/2023 21 ? 函數(shù)返回為 hostent的結(jié)構(gòu)類型,它的定義如下: ? struct hostent { ? char *h_name。 /* 一個(gè)以 NULL結(jié)尾的主機(jī)別名數(shù)組 */ ? int h_addrtype。 /* 地址的字節(jié)長度 */ ? char **h_addr_list。 ? define h_addr h_addr_list[0] /*在 haddrlist中的第一個(gè)地址 */ ? 當(dāng) gethostname( )調(diào)用成功時(shí),返回指向 struct hostent的指針,當(dāng)調(diào)用失敗時(shí)返回 1。 ? 無連接的客戶 /服務(wù)器程序的在原理上和連接的客戶 /服務(wù)器是一樣的,兩者的區(qū)別在于無連接的客戶 /服務(wù)器中的客戶一般不需要建立連接,而且在發(fā)送接收數(shù)據(jù)時(shí),需要指定遠(yuǎn)端機(jī)的地址。例如,程序執(zhí)行一個(gè)讀數(shù)據(jù)的函數(shù)調(diào)用時(shí),在此函數(shù)完成讀操作以前將不會(huì)執(zhí)行下一個(gè)程序語句。而非阻塞操作則可以立即完成。非阻塞socket在沒有客戶在等待時(shí)就使 accept調(diào)用立即返回。 ? ftl(sockfd,F_SETFL,O_NONBLOCK); ? …… 3/23/2023 23 ? 通過設(shè)置 socket為非阻塞方式,可以實(shí)現(xiàn)“輪詢”若干socket。但是這種“輪詢”會(huì)使CPU處于忙等待方式,降低系統(tǒng)性能,浪費(fèi)系統(tǒng)資源。 Select函數(shù)原型為 : ? int select(int numfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout)。如果要確定是否可以從標(biāo)準(zhǔn)輸入和某個(gè) socket描述符讀取數(shù)據(jù),只要將標(biāo)準(zhǔn)輸入的文件描述符 0和相應(yīng)的 sockfd加入到 readfds集合中;numfds的值是要檢查的號(hào)碼最高的文件描述符加 1,這個(gè)例子中 numfds的值應(yīng)為 sockfd+1;當(dāng) select返回時(shí), readfds將被修改,指示某個(gè)文件描述符已經(jīng)準(zhǔn)備被讀取,可以通過 FD_ISSSET( )來測試。 ? Timeout參數(shù)是一個(gè)指向 struct timeval類型的指針,它可以使 select( )在等待timeout長時(shí)間后沒有文件描述符準(zhǔn)備好即返回。 /* seconds ? int tv_usec。 3/23/2023 25 基于 POP3客戶端實(shí)例 ? 下面的代碼實(shí)例是基于 POP3的客戶協(xié)議,與郵件服務(wù)器連接并取回指定用戶帳號(hào)的郵件。具體 : ? include ? include ? include ? include ? include ? include sys/ ? include i/ ? include sys/ ? define POP3SERVPORT 110 ? define MAXDATASIZE 4096 ? main(int argc, char *argv[]){ ? int sockfd。 3/23/20
點(diǎn)擊復(fù)制文檔內(nèi)容
電大資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1