1. REUSEADDR
在绑定地址端口之前尽可能调用setsocktopt()来设置REUSEADDR套接字选项
使用了REUSEADDR选项后,可以使得不必等待TIME_WAIT状态消失就可以重启服务器
//设置REUSEADDR 选项
int on = 1;
run = setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
if(run < 0)
{
printf("error setsokopt \n");
return -5;
}
2.服务器连接多个客户端
使用多进程进行处理,用子进程处理链接
父进程继续处理accept();从完成链接队列中再获取一个
服务器端有两个套接字,一个已连接套接口,主要是用来通信的
一个监听调节口,主要实现三次握手的过程
客户端只有一个套接字,链接套接字
//服务器端函数
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
void do_service(int conn)
{
//实现回射通信
char recvbuf[1024];
while(1)
{
memset(recvbuf,0,sizeof(recvbuf));
int ret=0;
//接受客户端的请求,read()失败返回-1
ret = read(conn,recvbuf,sizeof(recvbuf)); //返回实际接受到的字节数
if(ret == 0) //说明客户端关闭了
{
printf("client close \n");
break;
}
else if(ret == -1) //-1表示失败了
{
printf("error read() \n");
break;
}
//对请求进行处理
printf("%s",recvbuf);
//对客户端进行数据应答
write(conn,recvbuf,ret);
}
}
int main()
{
int listenfd;
int run;
//首先调用socket()函数创建套接字
listenfd =socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); //在LINUX 下可以用man socket 查询该函数的具体描述
if(listenfd < 0)
{
printf("ERROR\n");
return -1;
}
struct sockaddr_in servaddr; //IPV4的地址结构
m