




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第二章、套接口編程根底套接口根本概念套接口地址構(gòu)造字節(jié)序網(wǎng)絡(luò)編程根本模型一些常用函數(shù)第二章、套接口編程根底套接口根本概念1概述本章主要介紹網(wǎng)絡(luò)編程的根本數(shù)據(jù)構(gòu)造、字節(jié)序、網(wǎng)絡(luò)編程的根本模型由于課時限制,SocketAPI的根本編程函數(shù)不集中講述,將在本章和下一章中結(jié)合根本概念和編程講述下一章,將結(jié)合簡單的迭代效勞器講述套接口的根本函數(shù)概述本章主要介紹網(wǎng)絡(luò)編程的根本數(shù)據(jù)構(gòu)造、字節(jié)序、網(wǎng)絡(luò)編程的根21.套接字概念Unix、TCP/IP協(xié)議的開展Unix與BSDTCP/IP協(xié)議的實現(xiàn)以BSD為根底的協(xié)議編程接口——socketAPI成為網(wǎng)絡(luò)編程的標(biāo)準(zhǔn)4.4BSD的協(xié)議棧中實現(xiàn)中了4種協(xié)議,不僅僅是TCP/IPTCP/IPXNS〔已經(jīng)刪除〕OSI/TLIUnix域1.套接字概念Unix、TCP/IP協(xié)議的開展3BSD協(xié)議棧構(gòu)造SocketAPI是一個網(wǎng)絡(luò)編程接口,并非一個協(xié)議層套接口除了操縱傳輸層外、還可以操縱網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層SocketAPI可以操縱多種協(xié)議棧:TCP/IP、Unix、TLI、XNS等BSD協(xié)議棧構(gòu)造4協(xié)議棧的實現(xiàn)參考Richard.Stevens,TCP/IP詳解卷2Linux下的實現(xiàn)在/usr/src/linux-source-2.6.32/net協(xié)議棧的實現(xiàn)5創(chuàng)立套接字的函數(shù)-socket要使用網(wǎng)絡(luò)協(xié)議,首先要創(chuàng)立套接口(socket)mansocket創(chuàng)立套接字的函數(shù)-socket要使用網(wǎng)絡(luò)協(xié)議,首先要創(chuàng)立套接6什么是套接口?socket是一個文件描述符BSD的實現(xiàn)者,將網(wǎng)絡(luò)協(xié)議的操作抽象成為文件的操作為什么要如此抽象?文件的讀、寫等操作具有一般性除了socket抽象成為文件外,還有那些東西被抽象成為文件?目錄設(shè)備epoll、kqueue…什么是套接口?7文件描述符的含義進(jìn)程構(gòu)造文件描述符表文件表文件構(gòu)造socket構(gòu)造文件操作函數(shù)表inpcb文件描述符的含義8套接字類型套接字支持多種通信協(xié)議:Unix:Unix系統(tǒng)內(nèi)部協(xié)議INET:IP版本4INET6:IP版本6套接字類型,即應(yīng)用程序希望的通信效勞類型SOCKET_STREAM:雙向可靠數(shù)據(jù)流,對應(yīng)TCPSOCKET_DGRAM:雙向不可靠數(shù)據(jù)報,對應(yīng)UDPSOCKET_RAW:是低于傳輸層的低級協(xié)議或物理網(wǎng)絡(luò)提供的套接字類型,可以訪問內(nèi)部網(wǎng)絡(luò)接口。Protocol? /usr/include/bits/socket.h /usr/include/netinet/in.h套接字類型套接字支持多種通信協(xié)議:92.網(wǎng)絡(luò)地址構(gòu)造網(wǎng)絡(luò)的地址表示方式有哪些?IPv4域名,Dns點(diǎn)分十進(jìn)制,192.168.1.1編程使用的構(gòu)造IPv4地址定義:/usr/include/netinet/in.h/usr/include/bits/sockaddr.h/*Internetaddress.*/typedefuint32_tin_addr_t;structin_addr{in_addr_ts_addr;};2.網(wǎng)絡(luò)地址構(gòu)造網(wǎng)絡(luò)的地址表示方式有哪些?IPv410#define__SOCKADDR_COMMON(sa_prefix)\ sa_family_tsa_prefix##family /*sockaddr.h*//*StructuredescribinganInternetsocketaddress.*/structsockaddr_in{ __SOCKADDR_COMMON(sin_); /*Socketfamily*/ in_port_tsin_port; /*Portnumber.*/ structin_addrsin_addr; /*Internetaddress.*/ /*Padtosizeof`structsockaddr'.8bytes*/ unsignedcharsin_zero[sizeof(structsockaddr) -__SOCKADDR_COMMON_SIZE -sizeof(in_port_t) -sizeof(structin_addr)];}; /*16bytes*/#define__SOCKADDR_COMMON(sa_11Linux中的sockaddr_in定義與教材中稍有不同注意如下幾個宏:
/*Addresstoacceptanyincomingmessages.*/ #define INADDR_ANY ((in_addr_t)0x00000000) /*Addresstosendtoallhosts.*/ #define INADDR_BROADCAST ((in_addr_t)0xffffffff) /*Addressindicatinganerrorreturn.*/ #define INADDR_NONE ((in_addr_t)0xffffffff)Linux中的sockaddr_in定義與教材中稍有不同12IPv6地址定義 /*Ditto,forIPv6.*/ structsockaddr_in6 { __SOCKADDR_COMMON(sin6_); in_port_tsin6_port;/*Transportlayerport#*/ uint32_tsin6_flowinfo;/*IPv6flowinformation*/ structin6_addrsin6_addr;/*IPv6address*/ uint32_tsin6_scope_id; /*IPv6scope-id*/ }; /*28bytes*/IPv6地址定義13通用套接字地址構(gòu)造〔/usr/include/bits/socket.h〕 /*Structuredescribingagenericsocketaddress.*/ structsockaddr { __SOCKADDR_COMMON(sa_); /*Commondata:addressfamilyandlength.*/ charsa_data[14]; /*Addressdata.*/ };與教材中定義稍有不同使用sockaddr_in構(gòu)造前,一定要清空它bzero(&addr,sizeof(addr));通用套接字地址構(gòu)造〔/usr/include/bits/so14互聯(lián)網(wǎng)絡(luò)程序設(shè)計第2篇課件153.字節(jié)序什么是字節(jié)序?〔網(wǎng)絡(luò)地址使用的一個細(xì)節(jié)問題〕字節(jié)作為存儲和尋址的最小單位以字節(jié)為單位在內(nèi)存中的排列問題不同類型的機(jī)器上,對c語言原生類型字節(jié)排列的順序可能不一樣例子union{ shorts; charc[sizeof(short)];}un;un.s=0x0201;printf(“%d,%d\n〞,un.c[0], un.c[1]);x86運(yùn)行結(jié)果:1,2powerpc運(yùn)行結(jié)果:2,102010102地址低位地址高位x86powerpcun.c[0]un.c[1]3.字節(jié)序什么是字節(jié)序?〔網(wǎng)絡(luò)地址使用的一個細(xì)節(jié)問題〕0216將小序號字節(jié)放在低位字節(jié)的機(jī)器,稱為小序機(jī)器;將大序號字節(jié)放在高位字節(jié)的機(jī)器,稱為大序機(jī)器x86是小序機(jī)器,Arm是大序機(jī)器網(wǎng)絡(luò)字節(jié)序,按照大序機(jī)器傳送的字節(jié)序020102010201powerpcx86解釋?將小序號字節(jié)放在低位字節(jié)的機(jī)器,稱為小序機(jī)器;將大序號字節(jié)放17字節(jié)變換函數(shù)(/usr/include/netinet/in.h)htonsntohshtonlntohl字節(jié)變換函數(shù)(/usr/include/netinet/in18字節(jié)序的理解一個字符串在大序和小序機(jī)器上的排列是否有不同?一個字節(jié)0x12從大序機(jī)器傳遞到小序機(jī)器上,是否表現(xiàn)為0x21?C語言中的bit位定義,例如TCP頭部的定義: #if__BYTE_ORDER==__LITTLE_ENDIAN u_int16_tres1:4; u_int16_tdoff:4; … #elif__BYTE_ORDER==__BIG_ENDIAN u_int16_tdoff:4; u_int16_tres1:4; …字節(jié)序的理解一個字符串在大序和小序機(jī)器上的排列是否有不同?19注意只有C語言的原生類型:char、short、long等,才會出現(xiàn)字節(jié)序問題。下例構(gòu)造中,x、y是否會出現(xiàn)位置顛倒的情況?structX{ structYy; structZz;};網(wǎng)絡(luò)地址192.168.1.1,在IP包中的排列如何?注意只有C語言的原生類型:char、short、long等,204.網(wǎng)絡(luò)編程根本模型在面向連接的網(wǎng)絡(luò)協(xié)議編程時,通常都會采用client/sever模型,這是由協(xié)議所決定的。并且是多對一的效勞4.網(wǎng)絡(luò)編程根本模型在面向連接的網(wǎng)絡(luò)協(xié)議編程時,通常都會采用21對等網(wǎng)〔Peer-to-Peer,P2P〕呢?P2P是指邏輯上對等,如果采用TCP通信,在一次通信中,仍然存在client/server的劃分UDP呢?socketbindrecvfromsendto,采用同一個端口?對等網(wǎng)〔Peer-to-Peer,P2P〕呢?225.常用函數(shù)字節(jié)操縱函數(shù)/usr/include/strings.h#include<strings.h>voidbzero(void*dest,size_tnbytes);voidbcopy(constvoid*src,void*dest,size_tnbytes);intbcmp(constvoid*ptr1,constvoid*ptr2,size_tnbytes); Returns:0ifequal,nonzeroifunequal/usr/include/string.h#include<string.h>void*memset(void*dest,intc,size_tlen);void*memcpy(void*dest,constvoid*src,size_tnbytes);intmemcmp(constvoid*ptr1,constvoid*ptr2,size_tnbytes); Returns:0ifequal,<0or>0ifunequal(seetext)5.常用函數(shù)字節(jié)操縱函數(shù)23地址變換函數(shù)/usr/include/arpa/inet.h#include<arpa/inet.h>intinet_pton(intfamily,constchar*strptr,void*addrptr);Returns:1ifOK,0ifinputnotavalidpresentationformat,-1onerrorconst
char*inet_ntop(intfamily,constvoid*addrptr,char*strptr,size_tlen);Returns:pointertoresultifOK,NULLonerror地址變換函數(shù)24inet_pton10int11inet_pton(intfamily,constchar*strptr,void*addrptr)12{if(family==AF_INET){structin_addrin_val;if(inet_aton(strptr,&in_val)){memcpy(addrptr,&in_val,sizeof(structin_addr));return(1);}return(0);}errno=EAFNOSUPPORT;return(-1);}inet_pton10int25例子 charIPdotdec[20];
//存放點(diǎn)分十進(jìn)制IP地址
structin_addrs;
//IPv4地址構(gòu)造體
intmain(void)
{
//輸入IP地址
printf("PleaseinputIPaddress:");
scanf("%s",&IPdotdec);
//轉(zhuǎn)換
inet_pton(AF_INET,IPdotdec,(void*)&s);
printf("inet_pton:0x%x\n",s.s_addr);//注意得到的字節(jié)序
//反轉(zhuǎn)換
inet_ntop(AF_INET,(void*)&s,IPdotdec,16);
printf("inet_ntop:%s\n",IPdotdec);
}例子 charIPdotdec[20];
//存放點(diǎn)分26錯誤處理函數(shù)errno/usr/include/errno.h#ifndeferrnoexterninterrno;#endif當(dāng)系統(tǒng)調(diào)用或者庫調(diào)用出錯時,errno給出出錯的信息注意,errno并不是系統(tǒng)調(diào)用或函數(shù)調(diào)用的返回值errno可以看成一個整數(shù)值,出錯時errno為非0值errno是每線程一個實例if(somecall()==-1){ printf("somecall()failed\n"); if(errno==...) {...}}錯誤處理函數(shù)27perror#include<stdio.h>voidperror(constchar*s);perror打印errno對應(yīng)的出錯信息,同時打印一個定制的字符串sperror定制的能力有限strerror#include<string.h>char*strerror(interrnum);strerror打印errnum對應(yīng)的出錯信息perror28讀寫函數(shù)一個文件描述符對應(yīng)的操作封裝在file_operations{}構(gòu)造中,/usr/src/linux-source../include/linux/sched.hstructtask_struct{ … /*openfileinformation*/ structfiles_struct*files; …};/usr/src/linux-source../include/linux/fdtable.hstructfiles_struct{ … structfdtable*fdt; …};讀寫函數(shù)29structfdtable{ … structfile**fd;/*currentfdarray*/ …};/usr/src/linux-source../include/linux/fs.hstructfile{ … conststructfile_operations *f_op; …};structfdtable{30structfile_operations{ …
ssize_t(*read)(structfile*,char__user*,size_t,loff_t*); ssize_t(*write)(structfile*,constchar__user*,size_t,loff_t*); ssize_t(*aio_read)(structkiocb*,conststructiovec*,unsignedlong,loff_t); ssize_t(*aio_write)(structkiocb*,conststructiovec*,unsignedlong,loff_t); … int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);};structfile_operations{31read/write函數(shù)調(diào)用與socket關(guān)聯(lián)的file_operations構(gòu)造中操作函數(shù),向外收發(fā)數(shù)據(jù)對應(yīng)于BSD的協(xié)議棧,write最終要調(diào)用sosendsosend函數(shù)會調(diào)用協(xié)議的pr_usrreq函數(shù)read要調(diào)用soreceive函數(shù)soreceive函數(shù)會調(diào)用協(xié)議的pr_usrreq函數(shù)pr_usrreq是每個協(xié)議需要實現(xiàn)的用戶對協(xié)議的操作函數(shù)。除了收發(fā)數(shù)據(jù)最終會調(diào)用pr_usrreq外,bind、connet等函數(shù),由于會對TCP協(xié)議進(jìn)展操縱,也會調(diào)用pr_usrreq。pr_usrreq在哪里?在一個稱為protosw構(gòu)造中定義為一個函數(shù)插槽read/write函數(shù)調(diào)用與socket關(guān)聯(lián)的file_o32協(xié)議的堆疊,?TCP/IP詳解卷2?第7章協(xié)議的堆疊,?TCP/IP詳解卷2?第7章33read函數(shù)#include<unistd.h>ssize_tread(intfd,void*buf,size_tcount);
返回值:>=0正確返回;==-1,出錯count表示buf的大小,返回值無論如何不會超過它的大小有兩種返回0的情況對端關(guān)聯(lián)TCP連接,讀到頭了;count=0返回-1,需要檢查errno,有些錯誤可以處理EAGAIN/EWOULDBLOCK,表示非阻塞的讀寫EINTR,讀阻塞被信號中斷read函數(shù)#include<unistd.h>34#include<unistd.h>ssize_twrite(intfd,constvoid*buf,size_tcount);返回值:>0,實際發(fā)送的數(shù)據(jù)個數(shù);==-1,出錯向?qū)Χ税l(fā)送數(shù)據(jù),count表示buf中所含數(shù)據(jù)的大小出錯的情況EINTR,被信號中斷EAGAIN,非阻塞發(fā)送EPIPE,表示socket另一端寫關(guān)閉,何種情況?#include<unistd.h>35數(shù)據(jù)傳輸函數(shù)-send#include<sys/types.h>#include<sys/socket.h>ssize_tsend(ints,constvoid*msg,size_tlen,intflags);
返回:非0-發(fā)送成功的數(shù)據(jù)長度;-1-出錯;flags是傳輸控制標(biāo)志,其值定義如下:0:常規(guī)操作,如同write()函數(shù)MSG_OOB,發(fā)送帶外數(shù)據(jù)。MSG_DONTROUTE:忽略底層協(xié)議的路由設(shè)置,只能將數(shù)據(jù)發(fā)送給與發(fā)送機(jī)處在同一個網(wǎng)絡(luò)中的機(jī)器上。數(shù)據(jù)傳輸函數(shù)-send#include<sys/types36數(shù)據(jù)傳輸函數(shù)-recv#include<sys/types.h>#include<sys/socket.h>ssize_trecv(ints,void*buf,size_tlen,intflags);
返回:大于0表示成功接收的數(shù)據(jù)長度;0:對方已關(guān)閉,-1:出錯。flags是傳輸控制標(biāo)志,其值定義如下:0:常規(guī)操作,如同read()函數(shù);MSG_PEEK:只查看數(shù)據(jù)而不讀出數(shù)據(jù),后續(xù)讀操作仍然能讀該數(shù)據(jù);MSG_OOB:忽略常規(guī)數(shù)據(jù),而只讀帶外數(shù)據(jù);MSG_WAITALL:recv函數(shù)只有在將接收緩沖區(qū)填滿后才返回。數(shù)據(jù)傳輸函數(shù)-recv#include<sys/types37思考題使用C++封裝IPv4和IPv6地址。提示:參考boost::asio庫、ACE庫。UDP是否可以采用read、write函數(shù)發(fā)送數(shù)據(jù)?應(yīng)該如何做到?為什么UDP通常采用recvfrom/sendto來收發(fā)數(shù)據(jù)?思考題使用C++封裝IPv4和IPv6地址。提示:參考boo38第二章、套接口編程根底套接口根本概念套接口地址構(gòu)造字節(jié)序網(wǎng)絡(luò)編程根本模型一些常用函數(shù)第二章、套接口編程根底套接口根本概念39概述本章主要介紹網(wǎng)絡(luò)編程的根本數(shù)據(jù)構(gòu)造、字節(jié)序、網(wǎng)絡(luò)編程的根本模型由于課時限制,SocketAPI的根本編程函數(shù)不集中講述,將在本章和下一章中結(jié)合根本概念和編程講述下一章,將結(jié)合簡單的迭代效勞器講述套接口的根本函數(shù)概述本章主要介紹網(wǎng)絡(luò)編程的根本數(shù)據(jù)構(gòu)造、字節(jié)序、網(wǎng)絡(luò)編程的根401.套接字概念Unix、TCP/IP協(xié)議的開展Unix與BSDTCP/IP協(xié)議的實現(xiàn)以BSD為根底的協(xié)議編程接口——socketAPI成為網(wǎng)絡(luò)編程的標(biāo)準(zhǔn)4.4BSD的協(xié)議棧中實現(xiàn)中了4種協(xié)議,不僅僅是TCP/IPTCP/IPXNS〔已經(jīng)刪除〕OSI/TLIUnix域1.套接字概念Unix、TCP/IP協(xié)議的開展41BSD協(xié)議棧構(gòu)造SocketAPI是一個網(wǎng)絡(luò)編程接口,并非一個協(xié)議層套接口除了操縱傳輸層外、還可以操縱網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層SocketAPI可以操縱多種協(xié)議棧:TCP/IP、Unix、TLI、XNS等BSD協(xié)議棧構(gòu)造42協(xié)議棧的實現(xiàn)參考Richard.Stevens,TCP/IP詳解卷2Linux下的實現(xiàn)在/usr/src/linux-source-2.6.32/net協(xié)議棧的實現(xiàn)43創(chuàng)立套接字的函數(shù)-socket要使用網(wǎng)絡(luò)協(xié)議,首先要創(chuàng)立套接口(socket)mansocket創(chuàng)立套接字的函數(shù)-socket要使用網(wǎng)絡(luò)協(xié)議,首先要創(chuàng)立套接44什么是套接口?socket是一個文件描述符BSD的實現(xiàn)者,將網(wǎng)絡(luò)協(xié)議的操作抽象成為文件的操作為什么要如此抽象?文件的讀、寫等操作具有一般性除了socket抽象成為文件外,還有那些東西被抽象成為文件?目錄設(shè)備epoll、kqueue…什么是套接口?45文件描述符的含義進(jìn)程構(gòu)造文件描述符表文件表文件構(gòu)造socket構(gòu)造文件操作函數(shù)表inpcb文件描述符的含義46套接字類型套接字支持多種通信協(xié)議:Unix:Unix系統(tǒng)內(nèi)部協(xié)議INET:IP版本4INET6:IP版本6套接字類型,即應(yīng)用程序希望的通信效勞類型SOCKET_STREAM:雙向可靠數(shù)據(jù)流,對應(yīng)TCPSOCKET_DGRAM:雙向不可靠數(shù)據(jù)報,對應(yīng)UDPSOCKET_RAW:是低于傳輸層的低級協(xié)議或物理網(wǎng)絡(luò)提供的套接字類型,可以訪問內(nèi)部網(wǎng)絡(luò)接口。Protocol? /usr/include/bits/socket.h /usr/include/netinet/in.h套接字類型套接字支持多種通信協(xié)議:472.網(wǎng)絡(luò)地址構(gòu)造網(wǎng)絡(luò)的地址表示方式有哪些?IPv4域名,Dns點(diǎn)分十進(jìn)制,192.168.1.1編程使用的構(gòu)造IPv4地址定義:/usr/include/netinet/in.h/usr/include/bits/sockaddr.h/*Internetaddress.*/typedefuint32_tin_addr_t;structin_addr{in_addr_ts_addr;};2.網(wǎng)絡(luò)地址構(gòu)造網(wǎng)絡(luò)的地址表示方式有哪些?IPv448#define__SOCKADDR_COMMON(sa_prefix)\ sa_family_tsa_prefix##family /*sockaddr.h*//*StructuredescribinganInternetsocketaddress.*/structsockaddr_in{ __SOCKADDR_COMMON(sin_); /*Socketfamily*/ in_port_tsin_port; /*Portnumber.*/ structin_addrsin_addr; /*Internetaddress.*/ /*Padtosizeof`structsockaddr'.8bytes*/ unsignedcharsin_zero[sizeof(structsockaddr) -__SOCKADDR_COMMON_SIZE -sizeof(in_port_t) -sizeof(structin_addr)];}; /*16bytes*/#define__SOCKADDR_COMMON(sa_49Linux中的sockaddr_in定義與教材中稍有不同注意如下幾個宏:
/*Addresstoacceptanyincomingmessages.*/ #define INADDR_ANY ((in_addr_t)0x00000000) /*Addresstosendtoallhosts.*/ #define INADDR_BROADCAST ((in_addr_t)0xffffffff) /*Addressindicatinganerrorreturn.*/ #define INADDR_NONE ((in_addr_t)0xffffffff)Linux中的sockaddr_in定義與教材中稍有不同50IPv6地址定義 /*Ditto,forIPv6.*/ structsockaddr_in6 { __SOCKADDR_COMMON(sin6_); in_port_tsin6_port;/*Transportlayerport#*/ uint32_tsin6_flowinfo;/*IPv6flowinformation*/ structin6_addrsin6_addr;/*IPv6address*/ uint32_tsin6_scope_id; /*IPv6scope-id*/ }; /*28bytes*/IPv6地址定義51通用套接字地址構(gòu)造〔/usr/include/bits/socket.h〕 /*Structuredescribingagenericsocketaddress.*/ structsockaddr { __SOCKADDR_COMMON(sa_); /*Commondata:addressfamilyandlength.*/ charsa_data[14]; /*Addressdata.*/ };與教材中定義稍有不同使用sockaddr_in構(gòu)造前,一定要清空它bzero(&addr,sizeof(addr));通用套接字地址構(gòu)造〔/usr/include/bits/so52互聯(lián)網(wǎng)絡(luò)程序設(shè)計第2篇課件533.字節(jié)序什么是字節(jié)序?〔網(wǎng)絡(luò)地址使用的一個細(xì)節(jié)問題〕字節(jié)作為存儲和尋址的最小單位以字節(jié)為單位在內(nèi)存中的排列問題不同類型的機(jī)器上,對c語言原生類型字節(jié)排列的順序可能不一樣例子union{ shorts; charc[sizeof(short)];}un;un.s=0x0201;printf(“%d,%d\n〞,un.c[0], un.c[1]);x86運(yùn)行結(jié)果:1,2powerpc運(yùn)行結(jié)果:2,102010102地址低位地址高位x86powerpcun.c[0]un.c[1]3.字節(jié)序什么是字節(jié)序?〔網(wǎng)絡(luò)地址使用的一個細(xì)節(jié)問題〕0254將小序號字節(jié)放在低位字節(jié)的機(jī)器,稱為小序機(jī)器;將大序號字節(jié)放在高位字節(jié)的機(jī)器,稱為大序機(jī)器x86是小序機(jī)器,Arm是大序機(jī)器網(wǎng)絡(luò)字節(jié)序,按照大序機(jī)器傳送的字節(jié)序020102010201powerpcx86解釋?將小序號字節(jié)放在低位字節(jié)的機(jī)器,稱為小序機(jī)器;將大序號字節(jié)放55字節(jié)變換函數(shù)(/usr/include/netinet/in.h)htonsntohshtonlntohl字節(jié)變換函數(shù)(/usr/include/netinet/in56字節(jié)序的理解一個字符串在大序和小序機(jī)器上的排列是否有不同?一個字節(jié)0x12從大序機(jī)器傳遞到小序機(jī)器上,是否表現(xiàn)為0x21?C語言中的bit位定義,例如TCP頭部的定義: #if__BYTE_ORDER==__LITTLE_ENDIAN u_int16_tres1:4; u_int16_tdoff:4; … #elif__BYTE_ORDER==__BIG_ENDIAN u_int16_tdoff:4; u_int16_tres1:4; …字節(jié)序的理解一個字符串在大序和小序機(jī)器上的排列是否有不同?57注意只有C語言的原生類型:char、short、long等,才會出現(xiàn)字節(jié)序問題。下例構(gòu)造中,x、y是否會出現(xiàn)位置顛倒的情況?structX{ structYy; structZz;};網(wǎng)絡(luò)地址192.168.1.1,在IP包中的排列如何?注意只有C語言的原生類型:char、short、long等,584.網(wǎng)絡(luò)編程根本模型在面向連接的網(wǎng)絡(luò)協(xié)議編程時,通常都會采用client/sever模型,這是由協(xié)議所決定的。并且是多對一的效勞4.網(wǎng)絡(luò)編程根本模型在面向連接的網(wǎng)絡(luò)協(xié)議編程時,通常都會采用59對等網(wǎng)〔Peer-to-Peer,P2P〕呢?P2P是指邏輯上對等,如果采用TCP通信,在一次通信中,仍然存在client/server的劃分UDP呢?socketbindrecvfromsendto,采用同一個端口?對等網(wǎng)〔Peer-to-Peer,P2P〕呢?605.常用函數(shù)字節(jié)操縱函數(shù)/usr/include/strings.h#include<strings.h>voidbzero(void*dest,size_tnbytes);voidbcopy(constvoid*src,void*dest,size_tnbytes);intbcmp(constvoid*ptr1,constvoid*ptr2,size_tnbytes); Returns:0ifequal,nonzeroifunequal/usr/include/string.h#include<string.h>void*memset(void*dest,intc,size_tlen);void*memcpy(void*dest,constvoid*src,size_tnbytes);intmemcmp(constvoid*ptr1,constvoid*ptr2,size_tnbytes); Returns:0ifequal,<0or>0ifunequal(seetext)5.常用函數(shù)字節(jié)操縱函數(shù)61地址變換函數(shù)/usr/include/arpa/inet.h#include<arpa/inet.h>intinet_pton(intfamily,constchar*strptr,void*addrptr);Returns:1ifOK,0ifinputnotavalidpresentationformat,-1onerrorconst
char*inet_ntop(intfamily,constvoid*addrptr,char*strptr,size_tlen);Returns:pointertoresultifOK,NULLonerror地址變換函數(shù)62inet_pton10int11inet_pton(intfamily,constchar*strptr,void*addrptr)12{if(family==AF_INET){structin_addrin_val;if(inet_aton(strptr,&in_val)){memcpy(addrptr,&in_val,sizeof(structin_addr));return(1);}return(0);}errno=EAFNOSUPPORT;return(-1);}inet_pton10int63例子 charIPdotdec[20];
//存放點(diǎn)分十進(jìn)制IP地址
structin_addrs;
//IPv4地址構(gòu)造體
intmain(void)
{
//輸入IP地址
printf("PleaseinputIPaddress:");
scanf("%s",&IPdotdec);
//轉(zhuǎn)換
inet_pton(AF_INET,IPdotdec,(void*)&s);
printf("inet_pton:0x%x\n",s.s_addr);//注意得到的字節(jié)序
//反轉(zhuǎn)換
inet_ntop(AF_INET,(void*)&s,IPdotdec,16);
printf("inet_ntop:%s\n",IPdotdec);
}例子 charIPdotdec[20];
//存放點(diǎn)分64錯誤處理函數(shù)errno/usr/include/errno.h#ifndeferrnoexterninterrno;#endif當(dāng)系統(tǒng)調(diào)用或者庫調(diào)用出錯時,errno給出出錯的信息注意,errno并不是系統(tǒng)調(diào)用或函數(shù)調(diào)用的返回值errno可以看成一個整數(shù)值,出錯時errno為非0值errno是每線程一個實例if(somecall()==-1){ printf("somecall()failed\n"); if(errno==...) {...}}錯誤處理函數(shù)65perror#include<stdio.h>voidperror(constchar*s);perror打印errno對應(yīng)的出錯信息,同時打印一個定制的字符串sperror定制的能力有限strerror#include<string.h>char*strerror(interrnum);strerror打印errnum對應(yīng)的出錯信息perror66讀寫函數(shù)一個文件描述符對應(yīng)的操作封裝在file_operations{}構(gòu)造中,/usr/src/linux-source../include/linux/sched.hstructtask_struct{ … /*openfileinformation*/ structfiles_struct*files; …};/usr/src/linux-source../include/linux/fdtable.hstructfiles_struct{ … structfdtable*fdt; …};讀寫函數(shù)67structfdtable{ … structfile**fd;/*currentfdarray*/ …};/usr/src/linux-source../include/linux/fs.hstructfile{ … conststructfile_operations *f_op; …};structfdtable{68structfile_operations{ …
ssize_t(*read)(structfile*,char__user*,size_t,loff_t*); ssize_t(*write)(structfile*,constchar__user*,size_t,loff_t*); ssize_t(*aio_read)(structkiocb*,conststructiovec*,unsignedlong,loff_t); ssize_t(*aio_write)(structkiocb*,conststructiovec*,unsi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房地產(chǎn)項目增資入股投資協(xié)議
- 二零二五年度辦公室文員聘用與企業(yè)文化融合協(xié)議
- 二零二五年度新能源汽車碰撞責(zé)任免除合同
- 2025年度現(xiàn)代農(nóng)業(yè)病蟲害防治藥害賠償協(xié)議書
- 二零二五年度勞動局標(biāo)準(zhǔn)合同:養(yǎng)老服務(wù)業(yè)員工就業(yè)保障協(xié)議范本
- 2025年度賬戶變更補(bǔ)充服務(wù)協(xié)議
- 高性能計算中心設(shè)備采購及安裝合同
- 企業(yè)辦公室裝飾設(shè)計與施工服務(wù)合同
- 教育培訓(xùn)行業(yè)線上課程開發(fā)與運(yùn)營計劃書
- 電氣設(shè)備安裝工程施工合同新
- 2《中國老年糖尿病診療指南(2024年版)》解讀
- 國自科項目申報協(xié)議書模板
- 行政或后勤崗位招聘筆試題及解答(某大型國企)2025年
- 2024年北京中考地理試卷
- 四川蜀道集團(tuán)筆試題
- 零食門市轉(zhuǎn)讓協(xié)議書范本
- 電氣自動化工程師考試題庫
- 小學(xué)利潤問題應(yīng)用題100道附答案(完整版)
- 醫(yī)院智能化系統(tǒng)內(nèi)網(wǎng)、外網(wǎng)及設(shè)備網(wǎng)系統(tǒng)拓?fù)鋱D-可編輯課件
- 小學(xué)生心理健康主題家長會
- 社交禮儀-儀態(tài)禮儀
評論
0/150
提交評論