net-server/server.c
2023-12-18 04:41:43 +08:00

77 lines
1.8 KiB
C

#include "inclu.h"
int main(int argc , char **argv)
{
char second[]="second";
/*声明服务器地址和客户链接地址*/
struct sockaddr_in servaddr , cliaddr;
/*声明服务器监听套接字和客户端链接套接字*/
int listenfd , connfd;
pid_t childpid;
/*声明缓冲区*/
char buf[MAX_LINE];
socklen_t clilen;
/*(1) 初始化监听套接字listenfd*/
if((listenfd = socket(AF_INET , SOCK_STREAM , 0)) < 0)
{
perror("socket error");
exit(1);
}//if
/*(2) 设置服务器sockaddr_in结构*/
bzero(&servaddr , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //表明可接受任意IP地址
servaddr.sin_port = htons(PORT);
/*(3) 绑定套接字和端口*/
if(bind(listenfd , (struct sockaddr*)&servaddr , sizeof(servaddr)) < 0)
{
perror("bind error");
exit(1);
}//if
/*(4) 监听客户请求*/
if(listen(listenfd , LISTENQ) < 0)
{
perror("listen error");
exit(1);
}//if
/*(5) 接受客户请求*/
for( ; ; )
{
clilen = sizeof(cliaddr);
if((connfd = accept(listenfd , (struct sockaddr *)&cliaddr , &clilen)) < 0 )
{
perror("accept error");
exit(1);
}//if
//新建子进程单独处理链接
if((childpid = fork()) == 0)
{
close(listenfd);
//str_echo
ssize_t n;
char buff[MAX_LINE];
while((n = read(connfd , buff , MAX_LINE)) > 0)
{
write(connfd , buff , n);
write(connfd , second , 6);
}
exit(0);
}//if
close(connfd);
}//for
/*(6) 关闭监听套接字*/
close(listenfd);
}