?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
IP地址的作用是标示计算机的|卡地址Q每台计机都有一个IP地址Q端口,是指计算ZZ标示在计机中访问网l的不同E序而设的编Pq不是网卡接U的端口Q而是不同E序的逻辑~号Qƈ不是实际存在的;域名Q是用来代替IP地址来标C机的一U直观名Uͼ例如癑ֺ|站的IP地址?02.108.22.43Q这个IP地址没有M逻辑含义Q不便记忆,而www.baidu.com是一个便于记忆的名称Q用于代替这个IP地址Q套接字的本意是插Q在|络中用来描q计机中不同程序与其他计算机程序的通信方式?/p>
常用的套接字cd?U:
Q?Q流套接字(SOCK——STREAMQ:使用了面向连接的可靠的数据通信方式Q即TCP协议Q?/p>
Q?Q数据报套接字(Raw SocketsQ:使用了不面向q接的数据传输方式,即UDPQ?/p>
Q?Q原始套接字QSOCK——RAWQ:没有l过处理的IP数据包,可以Ҏ自己E序的要求进行封装?/p>
|络协议是指不同的计机、不同的操作pȝ在进行网l通信时的l一U定。网l服务指的是|络上的计算机通过q行E序为其他的计算机提供信息或q算的功能?/p>
套接字相关的数据cdQsockaddr和sockaddr_inQsockaddr用来保存一个套接字Q定义如下:
struct sockaddr
{
unsigned short int sa_family; //指定通信地址cdQ如果是TCP/IP通信Q则gؓAF_inet
char sa_data[14]; //最多用14个字W长度,用来保存IP地址和端口信?/p>
};
sockaddr_in的功能与socdaddr相同Q也是用来保存一个套接字的信息,不同的是IP地址与端口分开Z同的成员Q定义如下:
struct sockaddr_in
{
unsigned short int sin_family; //指定通信地址cd
uint16_t sin_port; //套接字用的端口?/p>
struct in_addr sin_addr; //需要访问的IP地址
unsigned char sin_zero[8]; //未用的字段Q填充ؓ0
};
在这一l构中,in_addr也是一个结构体Q定义如下,用于保存一个IP地址Q?/p>
struct in_addr
{
uint32_t s_addt;
};
用域名取得主机的IP地址Q?/p>
struct hostent *gethostbyname(const char *name);
l构体hostent的定义如下:
struct hostent
{
char *h_name;//正式的主机名U?/p>
char **h_aliases;//q个L的别?/p>
int h_addrtype;//L名的cd
int h_length;//地址的长?/p>
char **h_addr_list;//从域名服务器取得的主机地址
}Q?/p>
用IP地址q回域名Q?/p>
struct hostent *gethostbyaddr(const void *addr,socklen_t len,int type);
由协议名取的协议数据Q?/p>
struct protoent *getprotobyname(char *name);
l构体protoent定义如下Q?/p>
struct protoent
{
char *p_name;//协议的名U?/p>
char **p_aliases;//协议的别?/p>
int p_proto;//协议的序?/p>
}Q?/p>
由协议编号取得协议信息:
struct protoent *getprotobynumber(int proto);
取得pȝ支持的所有协议:
struct protoent *getprotoent(void);
取得pȝ支持的网l服务:
struct servent *getservent(void);
l构体servent定义如下Q?/p>
struct servent
{
char *s_name;//q个服务的名U?/p>
char **s_aliases;//q个服务可能的别?/p>
int s_port;//q个服务可能的端?/p>
char *s_proto;//q个服务可能使用的协?/p>
};
用名U取得系l所支持的服务:
struct servent *getservbyname(char *name,char *proto); //nameQ服务器名称Qproto服务器所使用的协议;
q口取得服务名Uͼ
struct servent *getservbyport(int port,char *proto)
//port是端口的~号Q需要注意的是这个端口号需要用htons()函数q行转换Qproto表示一个协议的字符Ԍ
网l地址转换成长整型Q?/p>
long inet_addr(char *cp); //cp表示一个IP地址字符Ԍ
长整型IP地址转换成网l地址卛_端模式转换Q?/p>
char *inet_ntoa(struct in_addr in);
计机中的32位长整型数{换成|络字符序?2位长整型敎ͼ
uint32_t htonl(uint32_t hostlong)Q?/p>
计机中的16位整型数转换成网l字W顺序的16位整型数Q?/p>
uint16_t htons(uint16_t hostshort)Q?/p>
网l字W顺序的32位长整型数{换成计算Z?2位长整型敎ͼ
uint32_t ntohl(uint32_t netlong)Q?/p>
网l字W顺序的16位整型数转换成计机中的16位整型数Q?/p>
uint16_t ntohs(uint16_t netshort)Q?/p>
herror函数昄错误Q?/p>
void herror(const char *S); //s是一个字W串Q函数先输出q个字符Ԍ然后输出错误信息
创徏套接字函敎ͼ
int socket(int domain,int type,int protocol);
//参数domain用于指定创徏套接字所使用的协议族Q可取AF_UNIX,AF_INET,AF_INTE6Q?/p>
//参数type指定套接字的cdQ可取SOCK_STREAM,SOCK_DGRAM,SOCK_RAWQ?/p>
//参数protocol通常讄?
在指定套接字上创建链接函敎ͼ
int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen);
//参数sockfd是一个由函数socket创徏的套接字
//参数serv_addr是一个地址l构Q指定服务器的IP地址和端口号
//参数addrlen为参数serv_addr的长?/p>
一个套接字和某个端口绑定在一L函数Q?/p>
int bind(int sockfd,struct sockaddr *my_addr,socklen_t addrlen);
//一般只有服务器端的E序调用Q参数my_addr指定了sockfd绑定到的本地地址Q可以将参数my_addr的sin_addr讄为INADDR_ANY而不是某个确定IP地址可以绑定到M|络接口?/p>
把套接字转化动监听函敎ͼ
int listen(int s,int backlog);
//参数s为套接字Q参数backlog指定链接h队列的最大长度;
接收q接h函数Q?/p>
int accept(int s,struct sockaddr *addr,socklen_t *addrlen);
//参数s是由函数socket创徏Q经函数bindl定到本地某一端口上,然后通过函数listen转化而来的监听套接字
//参数addr用来保存发vq接h的主机的地址和端?/p>
//参数addrlen是addr所指向的结构体的大?/p>
在TCP套接字上发送数据函敎ͼ
ssize_t send(int s,const void *msg,size_t len,int flags);
//函数只能对处于连接状态的套接字用,参数s为已建立好连接的套接字描q符Q即accept函数的返回?/p>
//参数msg指向存放待发送数据的~冲?/p>
//参数len为待发送数据的长度Q参数flags为控刉项Q一般设|ؓ0
在TCP套接字上接收数据函数Q?/p>
ssize_t recv(int s,void *buf,size_t len,int flags);
//函数recv从参数s所指定的套接字描述W(必须是面向连接的套接字)上接收数据ƈ保存到参数buf所指定的缓冲区
//参数len则ؓ~冲区长度,参数flags为控刉项Q一般设|ؓ0
在UCP套接字上发送数据函敎ͼ
ssize_t sendto(int s,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_t tolen);
//函数功能与函数sendcMQ但函数sendto不需要套接字处于q接状态,所以该函数通常用来发送UDP数据Q同时因为是无连接的套接字,在用sendto旉要指定数据的目的地址Q参数msg指向待发送数据的~冲区?/p>
//参数len指定了待发送数据的长度
//参数flags是控刉项Q含义与send函数中的一?/p>
//参数to用于指定目的地址Q目的地址的长度由tolen指定
在UDP套接字上接收数据函数Q?/p>
ssize_t recvfrom(int s ,void *buf,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);
//与函数recv功能cMQ只是函数recv只能用于面向q接的套接字Q而函数recvfrom没有此限Ӟ可以用于从无q接的套接字上接收数?/p>
//参数buf指向接收~冲?/p>
//参数len指定了缓冲区的大?/p>
//参数flags是控刉项Q含义与recv中的一?/p>
//如果参数from非空Q且该套接字不是面向q接的,则函数recvfromq回Ӟ参数from中将保存数据的源地址
//参数fromlen在调用recvfrom前ؓ参数from的长度,调用recvfrom后将保存from的实际大?/p>
关闭套接字函敎ͼ
int close(int fd);
//参数fdZ个套接字描述W;
函数 int shutdown(int s,int how) 功能与closecMQ但是shutdown功能更强大,它允许对套接字进行单向关闭或全部止Q参数s为待关闭的套接字描述W,参数how指定了关闭的方式。
inetpd函数用于|络地址的格式{换;获取和设|套接字属性函敎ͼ
int getsockopt(int s,int level,int optname,void *optval,cocklen_t *optlen);
int setsockopt(int s,int level,int optname,const void *optval,socklen_t optlen);
//参数sZ个套接字
//参数level是进行套接字选项操作的层?/p>
//参数optname是套接字选项名称
//对于函数getsockoptQ参数opval用来存放获得的套接字选项Q参数optlen在调用函数前其gؓoptval指向的空间的大小Q调用完后则其gؓ参数optval所保存的结果的实际大小
//对于函数setsockoptQ参数optval是待讄的套接字选项的|参数optlen是选项的长?/p>
多\复用函数Q?/p>
int select(int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);
//参数n是需要监视的文g描述W数
//参数readfds指定需要监视的可读文g描述W集?/p>
//参数writefds指定需要监视的可写文g描述W集?/p>
//参数exceptfds指定需要监视的异常文g描述W的集合
//参数timeout指定了阻塞的旉
|络~程中有很多新的概念和协议,要好好理解。还有一些系l定义的数据cdQ要了解q些数据cdQ方便用。其ơ是要掌握一些常用函数的功能及用方法,|络~程我刚刚开始接触,感觉跟前面有很大区别Q必进一步学习才能有所提高?/p>