1. struct protoent *protocol=getprotobyname(char *p);
功能:通过协议名获取协议类型信息
解释:p为字符串指针,指向一个协议名,如icmp,struct protoent及函数在<netdb.h>中定义,protocol->p_proto为协议类型值。
2.send():send()函数执行成功意味着用户自定义缓冲区中的数据成功的复制到了套接字发送缓冲区,但不能保证数据已经发送出去。
3.read():当套接字为非阻塞方式时,用read()读取,若缓冲区中没有数据则read()返回小于0的数;
4.fcntl:可通过fcntl(sockfd,F_SETFL,O_NONBLOCK)将套接字设置为非阻塞方式;
5.计时函数:gettimeofdany(struct timeval *time,NULL)
struct timeval
{
long int tv_sec;
long int tv_usec;
};
6.inet_pton(AF_INET,*p_ip,*n_ip),inet_ntop(AF_INET,*n_ip,*p_ip,int len)
7.connect()函数对套接字和协议字段的影响:
(1)使用connect(sockfd,(struct sockaddr *)p,len)之后,sockfd仅接受p地址发过来的数据,注意原始套接字可以连接指定ip,但无法连接指定端口
(2)发送数据时不再指定地址,目的地址默认为p;
(3)告诉内核目的地址的相关信息,内核据此来填充各层协议首部中与目的地址相关的字段。
8.bind()函数对套接字的影响:
(1)调用bind(sockfd,(struct sockaddr *)p,len)后,sockfd仅接受目的地址为p的数据,原始套接字可bind()ip,不能bind()端口。
(2)告诉内核源地址的相关信息,内核据此来填充各层协议首部中与源地址相关的字段。
(3)指定了发送时所选的ip,自己绑定非通配ip时一定要选择一个合适的网络接口
TCP客户端套接字的connect()与bind()使用情况:
客户端程序通常不调用bind(),当调用connect()时,内核会为套接字绑定一个源地址rsc_IP与端口号con_port,
接收:该套接字仅接受目的ip为rsc_ip,目的端口号为con_port的数据
TCP服务器端套接字connect()与bind()的使用情况:
服务器端程序通常调用bind(),绑定端口port_number,但不绑定ip,将ip置为INADDR_ANY。
接收:套接字可接收发向本机的任何网口的数据(目的端口为port_number)
发送:把客户端发送的SYN包的目的地址当做源地址。
UDP客户端套接字的connect()与bind()使用情况:
客户端程序通常不调用bind(),当调用发送函数时,内核会为套接字绑定一个源地址rsc_IP与端口号con_port,
接收:该套接字仅接受目的ip为rsc_ip,目的端口号为con_port的数据
TCP服务器端套接字connect()与bind()的使用情况:
服务器端程序通常调用bind(),绑定端口port_number,但不绑定ip,将ip置为INADDR_ANY。
接收:套接字可接收发向本机的任何网口的数据(目的端口为port_number)
发送:把客户端发送的数据包的目的地址当做源地址。
connect()函数的返回值的意义:成功返回0,不成功返回-1,不成功时,跟据error值判断错误类型。
加入头文件<string.h>,字符串长度计算函数:strlen(*p),p为字符串指针,可以为指针,也可以是数组名