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

📄 server.c

📁 老师上课演示的在Linux上运行的网络聊天小程序,很有启发.
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#define MYPORT 3490  //端口号
#define BACKLOG 10  //最大连接数

main()
{
	int    sockfd,new_fd;
	struct sockaddr_in my_addr;
	struct sockaddr_in their_addr;
	int    sin_size;

    /*创建一个socket,赋值给sockfd,创建成功则继续,否则输出出错信息并结束运行*/

	if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
	{
           perror("socket");
           exit(1);
     }
        my_addr.sin_family=AF_INET;  //设定地址簇类型
        my_addr.sin_port=htons(MYPORT);  //给端口赋值
        my_addr.sin_addr.s_addr=INADDR_ANY;  //用连接地址进行自动填充IP
   	    bzero(&(my_addr.sin_zero),8);
/*将IP地址和端口信息绑定到前面创建的socket上,绑定成功则继续,否则输出出错信息并结束运行*/
   	if (bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==-1)
	{
	  perror("bind");
  	  exit(1);	
  	}
/*监听连接信号,和accept合用,并定义最大连接数,监听成功则继续,否则输出出错信息并结束运行*/
	if (listen (sockfd,BACKLOG)==-1)
    {
  	  perror("listen");	

	  exit(1);
	}
    /*循环等待客户端的连接消息*/
	while(1)
	{
	  sin_size=sizeof(struct sockaddr_in);
   /*和listen合用,监听消息,接收客户端的连接请求,sockaddr存放客户端的IP地址信息,接收成功则创建一个新的socket,赋值给new_fd,其中包含了客户端的信息*/
	  if ((new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size))==-1)
	    {
	       perror("accept");
	       continue;
	    }
	  printf("server:got connection from %s\n", inet_ntoa(their_addr.sin_addr));
	  if (!fork())		/*创建新的进程发送消息*/
	    {
               /*通过new_fd,向客户端发送消息*/
	       if (send (new_fd,"Hello,world!\n",14,0)==-1)
		        perror("send");
	        close(new_fd);
	        exit(0);
	    }
          close(new_fd);  //关闭socket
    	  while(waitpid(-1,NULL,WNOHANG)>0);
	}
}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -