📄 server.c
字号:
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h>
#include <fcntl.h>typedef struct socket_list{ int socket; struct socket_list *next; }socket_list;socket_list *gHead=NULL;/**********************************************/
void make_socket_nonblocking(int skt)
{
int flag;
flag = fcntl(skt, F_GETFL, 0);
fcntl(skt, F_SETFL, flag | O_NONBLOCK);
}
int main(int argc, char *argv[]) { int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber,nbytes; char buffer[1024]; socket_list *p1,*p2;
if(argc!=2) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1); }
if((portnumber=atoi(argv[1]))<0) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1); } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); exit(1); }
bzero(&server_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(portnumber); if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); exit(1); } make_socket_nonblocking(sockfd); if(listen(sockfd,5)==-1) { fprintf(stderr,"Listen error:%s\n\a",strerror(errno)); exit(1); }
while(1) { sin_size=sizeof(struct sockaddr_in); if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))>0) { make_socket_nonblocking(new_fd); p1=(socket_list*)malloc(sizeof(socket_list)); p1->socket=new_fd; //在链表头部插入 p1->next=gHead; gHead=p1; fprintf(stdout,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); }
p1=gHead; while(p1) { if((nbytes=recv(p1->socket,buffer,1024,0))==-1) {
switch (errno) {
case EAGAIN:
/* do nothing, no data to be read. */
break;
case EPIPE: // connection broke
case ENOTCONN: // shut down
case ECONNRESET:
break;
default:
fprintf(stderr,"problems reading from socket (%d)\n", errno);
break;
}
} else if(nbytes>0)// if readable and # of bytes is 0, then the client has shut down { buffer[nbytes]='\0'; if(send(p1->socket,buffer,strlen(buffer),0)==-1) { fprintf(stderr,"send Error:%s\n",strerror(errno)); exit(1); } } p1=p1->next; } }
close(sockfd); exit(0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -