#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;
}