网络应用需要遵循的应用层协议
:::info
:::info
- 总时间较大程度上取决去NF/Us,并且与N大小有关(线性增长关系)
节点加入组:torrent, 交换文件快chunk 获取组列表的机器tracker,
struct sockaddr_in{
u_char sin_len; //地址长度
u_char sin_family; //地址族(TCP/IP : AF_INET)
u_short sin_port; //端口号
struct in_addr sin_addr; //IP地址
char sin_zero[8]; //未用(置0)
}
int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
wVersionRequested = MAKEWORD(2,1);
err = WSAStartup(wVersionRequested,&wsaData);
int WSACleanup(void);
sd = socket(protofamily,type,proto); //作用==>创建套接字
type = SOCK_STREAM,SOCK_DGRAM or SOCK_RAW (TCP/IP)
struct protoent *p;
p = getprotobyname("tcp");
SOCKET sd = soket(PF_INET,SOCK_STREAM,p->p_proto);
sd = socket(protofamily,type,proto); //作用==>创建套接字
/*参数说明
protofamily : 套接字协议族,用于指明使用的协议PF_INET表示面向TCP/IP
type : 套接字类型
SOCK_STREAM , 流式套接字 面向TCP
SOCK_DGRAM , 数据报套接字 Data GRAM ,面向UDP
SOCK_RAW , 原始套接字 面向网络层IP/ICMP/IGMP...
操作系统对其套接字创建需要特殊权限(root/admin)
proto : protocol的缩写 ,指明协议号,默认0
*/
在WinSocket中是closesocket(),在BerkeleySocket中是close()
int closesocket(SOCKET sd); //关闭一个描述符为sd的套接字
//返回值为0==>执行成功
//返回值为SOCK_ERROR==>执行失败
int bind(sd,localaddr,addrlen); //绑定套接字本地端点地址==>IP地址+端口号(16进制长度)
- 解决方案==>使用地址通配符: INADDR_ANY
- 作用:声明在此服务器运行的此主机中任何一个有效的IP地址均可以访问
int listen(sd,queuesize); //将服务器端流套接字置于监听状态
//返回值为0==>执行成功
//返回值为SOCK_ERROR==>执行失败
connect(sd,saddr,saddrlen); //客户机套接字与目的主机套接字的端点地址进行连接
newsock = accpet(sd,caddr,caddrlen);
//发送数据
send(sd,*buf,len,flags);
sendto(sd,*buf,len,flags,destaddr,addrlen);
//接收数据
recv(sd,*buffer,len,flags);
recvfrom(sd,*buf,len,flags,senderaddr,saddrlen);
int setsockopt(int sd,int level,int optname,*optval,int optlen);
int getsockopt(int sd,int level,int optname,*optval,socklen_t,*optval)
WinSock体系下基于Windows | WSAStartup | 初始化socket库 |
---|---|---|
WSACleanup | 清除/终止sicket库的使用 | |
BerkeleySock体系下基于Linux/Unix | socket | 创建套接字 |
connect(C端专用) | 发起请求"连接"远端服务器 | |
closesocket/close | 释放/关闭套接字(前者基于WinSock,后者基于BerkeleySock) | |
bind(通常C端由OS调用) | 绑定套接字本地IP和端口号 | |
listen | 设置TCP套接字为监听模式,同时设置请求队列大小 | |
accept | 接收/提取一个连接请求,创建新套接字(建立连接通道) | |
send | 发送数据(TCP套接字/连接模式的C端UDP套接字) | |
sendto | 发送数据报(非连接的UDP) | |
recv | 接收数据(TCP套接字/连接模式的C端UDP套接字) | |
recvfrom | 接收数据报(非连接的UDP) | |
setsockopt | 设置套接字选项参数 | |
getsockopt | 获取套接字选项参数 |
当用户使用服务端域名/点分十进制标识IP地址时,需要将域名和IP地址进行转换
struct hostent{
char FAR* h_name; //official host name
char FAR*FAR* h_aliases; //other aliases
short h_addrtype; //address type
short h_lengty; //address length
char FAR*FAR* h_addr_list; //list of address
};
#define h_addr h_addr_list[0]
struct servent{
char FAR* s_name; //official service name
char FAR*FAR* s_aliases; //other aliases
short s_port; //port for this service
char FAR* s_proti; //protocal to use
};
struct protoent{
char FAR* p_name; //official protocol name
char FAR*FAR* p_aliases; //list of aliases allowed
short p_proto; //official protocol number
};
retcode = sendto(socket,data,length,flags,destaddr,addrlen);
/*
参数列表
socket --服务器UDP套接字
data --存储待发送数据的缓存地址(指针类型)
length --缓存中数据字节数
flags --调试与控制选项的标志位(常置0)
destaddr --指向sockaddr_in指针(客户端端点地址)
addrlen --地址结构长度
*/
retcode = recvfrom(socket,buf,length,flags,from,fromlen);
/*
参数列表
socket --服务器UDP套接字
buf --存储数据报缓存地址(指针类型)
length --缓存中数据字节数
flags --调试与控制选项的标志位(常置0)
from --指向sockaddr_in缓存地址(客户端端点地址)
fromlen --源地址结构长度
*/