Unix学习笔记------套接字----服务器端函数

简单的服务器模型:::::


socket




/*
要点:
对于给定的监听套接口,内核要为其维护俩个队列:
1.已完成连接的队列
2.未完成连接的队列



*/
 int main()
 {
int sockfd =0;
sockfd =socket(PF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("fun socket \n");
exit(0);

}
struct sockaddr_in srvaddr;
srvaddr.sin.family=AF_INET;
srvaddr.sin_port=htons(8001);
srvaddr.sin.addr.s_addr=inet_addr("192.168.6.249");

if(bind(sockfd,(struct sockaddr*)&srvaddr,sizeof(srvaddr))
{
perror("fun socket \n");
exit(0);

}
//一旦调用listen函数,这个套接字sockfd将变成被动套接字(只能接受连接,不能主动的发送连接)
//listen做了俩个队列

if(listen(sockfd,SOMAXCONN)<0)
{
perror("fun listen \n");
exit(0);

}

// 服务器端怎么知道客户端的IP地址的??


struct sockaddr peeraddr;//这句话的意思是定义一个套接字地址变量,为什么要定义这个变量???它的作用是什么???


//tcp ip地址结构
socklen_t perrlen;
struct sockaddr_in perraddr;
perrlen =sizeof(perraddr);

int  conn=0;


conn=accept(sockfd,(struct sockaddr*)perraddr,(socklen_t*)&perrlen);  

if(conn==-1)
{
perror("fun listen \n");
exit(0);

}

//我的理解是,accept函数的作用是不是从listen的已完成连接队列中,
//把第一个队列成员取出,放到新开辟的perraddr变量中。
// 即accept函数的返回不是通过返回值返回,而是通过参数返回即:向参数中写入内容。

//打印出accept得到的客户端的套接字内容

char *inet_ntoa(struct in_addr  in);//把点分转换成32位数
printf("客户端的IP地址为:% \n",inet_ntoa(perraddr.sin.port));
printf("客户端的端口号为:%d \n",ntohs(perraddr.sin.addr));

perraddr.sin.port;
perraddr.sin_addr;

//连接建立以后,开始读写数据
//开辟一个内存区域用于容纳读取的内容
char  revbuf[1024]={0};




while(1)
{
//read函数,从文件描述符里面读取数据把数据读取到这个自己开辟的内存里面即:buf

int ret=read(conn,revbuf,sizeof(revbuf));
if(ret==0)
{
//如果在读的过程重,对方已经关闭,tcpip 协议会返回一个0的数据包
printf("对方已经关闭");
exiy(0);

}
else if(ret<0)
{
printf("读取数据失败");
exit(0);

}
//下面开始写数据
fputs(revbuf,stdout);//服务器端收到数据,打印到屏幕上。
write(conn,revbuf,ret);//服务器回发报文。


}

return 0;

 }

你可能感兴趣的:(Unix学习笔记------套接字----服务器端函数)