目录
2、优化2:获取程序刚建链接的socket的客户端的IP地址和端口号
服务器并发编程实战
1、优化1:让服务器程序能绑定在任意的IP上
INADDR\_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。
htonl(INADDY_ANY) //INADDY_ANY: -1
1、优化1:让服务器程序能绑定在任意的IP上
#if 1 //让 else 的代码失效
sin.sin_addr.s_addr = htonl(INADDY_ANY); // INADDY_ANY: -1补码存储32位全是1,
#else
可以让服务器可以绑定到任意的机器上,没有强行绑定到哪个IP上任意网卡,只要满足网络类型(TCP)+ 端口。就行
linux 虚拟一个网卡:
sudo inconfig eth0:0 13x.xx7.4xx.8xx
2、优化2:获取程序刚建链接的socket的客户端的IP地址和端口号
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
如果想取到哪个客户端调用,客户端会填充ip地址和端口号
inet_ntop(int af,const void *src,char *dst,socklen_t size):把IPV4/IPV6的网络字节序的地址变成本地的字符串形式的IP地址
特点:适应于IPV4和IPV6、能正确处理-1的转换问题
参数:af:地址协议簇(AF_INET或AF_INET6)
src: 是一个指针(32位网络字节序的IP地址)
dst:输出结果为点分形式的IP地址【主要指IPV4】
返回值:
成功返回非空指针,失败:空指针
struct sockaddr_in cin;
addrlen = sizeof(cin);
if(newfd = accept(fd,(struct sockaddr *)&cin,&addrlen) < 0){
perror("accept");
exit(1);
}
//拿到网络字节序,显示串口或点分本地字节序
char ipv4_addr[16]; //xxx.xxx.xxx.xxx + '\0',其中xxx. 占4个字节 3*4+3+1 = 16
if(!inet_ntop(AF_INET,(void *)&cin.sin_addr.s_addr,ipv4_addr,sizeof(cin))){
perror("inet_ntop");
exit(1);
}
printf("Clinet(%s:%d) is connected!",ipv4_addr,ntons(cin.sin_port));
3、优化3:用多进程/多线程处理已经建立好连接的客户端数据
pthread_t tid;
struct sockaddr_in cin;
addrlen = sizeof(cin);
while(1){
if(newfd = accept(fd,(struct sockaddr *)&cin,&addrlen) < 0){
perror("accept");
exit(1);
}
//拿到网络字节序,显示串口或点分本地字节序
char ipv4_addr[16]; //xxx.xxx.xxx.xxx + '\0',其中xxx. 占4个字节 3*4+3+1 = 16
if(!inet_ntop(AF_INET,(void *)&cin.sin_addr.s_addr,ipv4_addr,sizeof(cin)))