加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

基本UDP套接字编程入门

发布时间:2022-09-16 15:43:57 所属栏目:Unix 来源:
导读:  UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流。UDP常见领域:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)。

  典型的UDP程序:客户不与服务器建立连接,
  UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流。UDP常见领域:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)。
 
  典型的UDP程序:客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,其中必须指定目的地的地址作为参数。同样,服务器不接受来自客户端的连接,而是只管调用recvfrom函数,等待来自某个客户的数据到达。recvfrom将与所接收的数据报一道返回客户的协议地址,因此服务器可以把相应发送给正确的客户。
 
  recvfrom和sendto函数简介
 
  #include
  #include
 
  ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                          struct sockaddr *src_addr, socklen_t *addrlen);
  ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                        const struct sockaddr *dest_addr, socklen_t addrlen);
  坑:对于放在epoll事件中的sockfdunix网络编程,recvfrom的最后一个参数必须初始化。
 
  简单的UDP回射服务端
 
  #include    "unp.h"
 
  void
  dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
  {
      int         n;
      socklen_t   len;
      char        mesg[MAXLINE];
      for ( ; ; ) {
          len = clilen;
          n = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
          Sendto(sockfd, mesg, n, 0, pcliaddr, len);
      }
  }
  int
  main(int argc, char **argv)
  {
      int                 sockfd;
      struct sockaddr_in  servaddr, cliaddr;
      sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
      bzero(&servaddr, sizeof(servaddr));
      servaddr.sin_family      = AF_INET;
      servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
      servaddr.sin_port        = htons(SERV_PORT);
      Bind(sockfd, (SA *) &servaddr, sizeof(servaddr));
      dg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));
  }
  简单的UDP回射客户端
 
  #include    "unp.h"
 
  void
  dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
  {
      int n;
      char    sendline[MAXLINE], recvline[MAXLINE + 1];
      while (Fgets(sendline, MAXLINE, fp) != NULL) {
          Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
          n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);
          recvline[n] = 0;    /* null terminate */
          Fputs(recvline, stdout);
      }
  }
  int
  main(int argc, char **argv)
  {
      int                 sockfd;
      struct sockaddr_in  servaddr;
      if (argc != 2)
          err_quit("usage: udpcli ");
      bzero(&servaddr, sizeof(servaddr));
      servaddr.sin_family = AF_INET;
      servaddr.sin_port = htons(SERV_PORT);
      Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
      sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
      dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));
      exit(0).
 

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章