⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.c

📁 linux下基于ssl安全套接字设计的一个聊天程序
💻 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 + -