• 基于UDP协议的服务器编程


    #include <sys/socket.h>
    #include <netdb.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <signal.h>
    #include <time.h>

    int sockfd;

    void sig_handler(int signo)
    {
        if(signo == SIGINT)
        {
            printf("server close ");
            close(sockfd);
            exit(1);
        }
    }

    void out_addr(struct sockaddr_in *clientaddr)
    {
        char ip[16];
        memset(ip,0,sizeof(ip));
        inet_ntop(AF_INET,&clientaddr->sin_addr.addr,ip,sizeof(ip));
        int port = ntohs(clientaddr->sin_port);
        printf("client: %s(%d) ",ip,port);
    }


    void do_service()
    {
        struct sockaddr_in clientaddr;
        socklen_t len= sizeof(clientaddr);
        char buffer[1024];
        memset(buffer,0,sizeof(buffer));
        if(recvfrom(sockfd,buffer,sizeof(buffer),0,
                  (struct sockaddr*)&clientaddr,&len) < 0 )
            perror("recvfrom error");
        else
        {
            out_addr(&clientaddr);
            printf("client send into:%s ",buffer);
            
            //向客户端发送数据报文
            long int t = time(0);
            char *ptr = ctime(&t);
            size_t size = strlen(ptr) * sizeof(char);
            if(sendto(sockfd,ptr,size,0,(struct sockaddr*)&clientadrr,len) < 0)
            {
                perror("sendto error");
            }
            
        }
    }

    int main(int argc,char *argv[])
    {
         if(argc < 2)
         {
            printf("usage:%s port ",argv[0]);
            exit(1);
         }
        
         if(signal(SIGINT,sig_handler)== SIG_ERR)
         {
            perror("signal sigint error");
            exit(1);
         }
        
         /*步骤1 创建socket*/
         sockfd = socket(AF_INET,SOCK_DGRAM,0);
         if(sockfd < 0)
         {
            perror("socket error");
            exit(1);
         }
        
         int ret;
         int opt = 1;
         //设置套接字选项
         if((res= setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,
              &opt,sizeof(opt)))<0)
          {
            perror("setsockopt error");
            exit(1);
          }
        
         /*步骤2:调用bind函数对socket和地址进行绑定*/
         struct sockaddr_in serveraddr;
         memset(&serveraddr,0,sizeof(serveraddr));
         serveraddr.sin_family = AF_INET;
         serveraddr.sin_port = htons(atoi(argv[1]));
         serveraddr.sin_addr.s_addr = INADDR_ANY;
         if((bind(sockfd,(struct sockaddr*)&serveraddr,
                          sizeof(serveraddr))) < 0)
          {
            perror("bind error");
            exit(1);
          }
          
          /*步骤3: 和客户端进行双向的数据通信*/
          while(1)
          {
            do_service();
          }      
          
          return 0;
    }







  • 相关阅读:
    ReentrantLock与Condition构造有界缓存队列与数据栈
    ReentrantLock
    文件下载
    scala初学
    bootstrap table 显示连续序号,分页有效
    web中servletcontext和applicationContext
    checkbox是否选中判断
    bookstrap form表单简单-smart-form
    charts柱状图,定时刷新
    js对象和json的区别
  • 原文地址:https://www.cnblogs.com/lvdh1314/p/6504388.html
Copyright © 2020-2023  润新知