#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
int fd;
void fa(int signo){
printf("服务器即将关闭\n");
sleep(1);
close(fd);
exit(0);
}
int main(){
printf("按ctrl+C退出服务器\n");
signal(SIGINT,fa);
fd = socket(AF_INET,SOCK_STREAM,0);//必须stream
if(fd == -1) perror("socket"),exit(-1);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(2222);
addr.sin_addr.s_addr=inet_addr("192.168.182.10");
int reuse = 1;//解决地址被占用的问题
setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,
&reuse,sizeof(reuse));
int res = bind(fd,(struct sockaddr*)&addr,
sizeof(addr));
if(res == -1) perror("bind"),exit(-1);
printf("bind ok\n");
listen(fd,100);//等待队列最大长度100
while(1){
struct sockaddr_in from;
socklen_t len = sizeof(from);//带值传入
int sockfd = accept(fd,(struct sockaddr*)&from,
&len);//阻塞函数
printf("%s连接了\n",inet_ntoa(from.sin_addr));
pid_t pid = fork();//accept()成功后创建子进程
if(!pid){
char buf[100] = {};
while(1){
res = read(sockfd,buf,sizeof(buf));
printf("读到了%d字节,内容:%s\n",res,buf);
if(res == -1) { perror("read"); break; }
else if(!res) break;
if(!strcmp(buf,"bye")) break;
write(sockfd,buf,strlen(buf));
memset(buf,0,strlen(buf));
}
close(sockfd); exit(0); }
close(sockfd);
}//练习:用信号退出服务器,并关闭fd。
}
- 1
- 2
前往页