#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>

int main(void)
{
    int socketfd;
    struct sockaddr_in addr_s;      //服务器套接字信息变量
    struct sockaddr_in addr_c;      //客户端套接字信息变量
    int protect=0;                      //防止程序自动退出的变量
    socklen_t length;
int newfd;
char clientbuf[1024]= "\0";		//获取客户端的buff
    int protec;
    
//step1-创建套接字,如果socketfd的值为-1表示创建失败
    socketfd=socket(AF_INET,SOCK_STREAM,0);
    if(socketfd==-1)
    {
        perror("socket");
        return -1;
}           

else
{
    	printf("socket::Success\nsocket id::%d\n",socketfd);
}

    //step2-初始化套接字变量addr_s,然后将套接字信息赋值给addr_s
    memset(&addr_s,0,sizeof(addr_s));

addr_s.sin_family = AF_INET;
//INADDR_ANY常量监听所有IP地址,并打开2013端口
    addr_s.sin_addr.s_addr = htonl(INADDR_ANY);
    addr_s.sin_port = htons(2013);

    //step3-调用bind函数绑定端口,并判断是否绑定成功
//强制转换addr变量为struct sockaddr接口体类型
    if(bind(socketfd,(struct sockaddr *)&addr_s,sizeof(addr_s))==-1)
    {
        perror("connect");
        return -1;
    }
    //step4-调用listen函数,使程序进入监听状态,设置最大并发连接数为3
if(listen(socketfd,3)==-1)
    {
        printf("listen failed!!\n");
        perror("listen");
    }
    else
    {
        printf("Listening…………\n");
    }

    //服务器接受连接请求,并保存客户端的socket信息
    length=sizeof(addr_c);
    newfd=accept(socketfd,(struct sockaddr *)&addr_c,&length);
    if(newfd==-1)
    {
        perror("accept");
    }
    else
    {
        //提示接收成功并显示客户端IP地址和客户端端口
        printf("accept  new connect::OK\n");
        printf("client ip addr:%s\n",inet_ntoa(addr_c.sin_addr));
        printf("client port:%d\n",ntohs(addr_c.sin_port));
    }
	
//调用read函数,并判断是否能读取到信息,注意socket参数取客户端的
//如果返回值小于0,则读取失败
if(read(newfd,clientbuf,sizeof(clientbuf))<0)
{
	perror("accept");
}
else
{
	printf("mess::%s\n",clientbuf);
}

//为了防止程序自动退出,我们在程序结尾加上一个scanf语句防止它自动结束
    printf("are you sure want to quit?press any key\n");
    scanf("%d",&protec);
    printf("you are quited\n");
    return 0;
}