📄 server.c
字号:
#include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <string.h>#include <stdio.h>#include <stdlib.h>#include <errno.h> #define MY_PORT 8888 int main(int argc ,char **argv) { int listen_fd,accept_fd; struct sockaddr_in client_addr; int n; /* 服务器端开始建立socket描述符 */ if((listen_fd=socket(AF_INET,SOCK_STREAM,0))<0) { printf("Socket Error:%s\n\a",strerror(errno)); exit(1); } /* 服务器端填充 sockaddr结构 */ bzero(&client_addr,sizeof(struct sockaddr_in)); client_addr.sin_family=AF_INET; client_addr.sin_port=htons(MY_PORT); client_addr.sin_addr.s_addr=htonl(INADDR_ANY); n=1; /* 如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间 */ setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int)); // SO_REUSEADDR允许重用本地地址和端口 /* 捆绑sockfd描述符 */ if(bind(listen_fd,(struct sockaddr *)&client_addr,sizeof(client_addr))<0) { printf("Bind Error:%s\n\a",strerror(errno)); exit(1); } /* 监听sockfd描述符 */ listen(listen_fd,5); while(1) { /* 服务器阻塞,直到客户程序建立连接 */ accept_fd=accept(listen_fd,NULL,NULL); if((accept_fd<0)&&(errno==EINTR)) continue; else if(accept_fd<0) { printf("Accept Error:%s\n\a",strerror(errno)); continue; } if((n=fork())==0) { /* 子进程处理客户端的连接 */ char buffer[1024]; close(listen_fd); n=read(accept_fd,buffer,1024); // 从文件accept_fd读取1024字节到buffer缓冲区 write(accept_fd,buffer,n); // 从buffer缓冲区写n字节到文件accept_fd close(accept_fd); exit(0); } else if(n<0) printf("Fork Error:%s\n\a",strerror(errno)); close(accept_fd); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -