打开一个 UDP socket 的程序

int create_udp_socket(const char * addr, uint16_t port,const char * localaddr,uint16_t localport)
{
  struct sockaddr_in saddr,slocaladdr;
  int r;
  int fd;
  int len = sizeof(saddr);
  int on = 1;
  memset(&saddr,0,sizeof(saddr));
  memset(&slocaladdr,0,sizeof(slocaladdr));

  fd= socket(AF_INET,SOCK_DGRAM,0);
  if(fd<0){
    mylog(LOG_WARNING,"create_udp_socket: fd socket failed:%s\n",strerror(errno));
    fd=-1;
    return -1;
  }
  r = setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
  if(r<0){
    mylog(LOG_WARNING,"create_udp_socket:setsockopt failed:%s\n",strerror(errno));
    return -1;
  }
  if(NULL!=localaddr){
    slocaladdr.sin_family = AF_INET;
    slocaladdr.sin_port = htons(localport);
    r = inet_pton(AF_INET,localaddr ,&slocaladdr.sin_addr);
    if(r<0){
      mylog(LOG_WARNING,"create_udp_socket: inet_pton(%s:%d) return %d,error:%s\n",localaddr,localport,r,strerror(errno));
      return -1;
    }
    r = bind(fd,(struct sockaddr*)&slocaladdr,sizeof(slocaladdr));
    if(r<0){
      mylog(LOG_WARNING,"create_udp_socket: bind failed:%s\n",strerror(errno));
      return -1;
    }
  }
  if(NULL!=addr){
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(port);
    r = inet_pton(AF_INET,addr,&saddr.sin_addr);
    if(r<0){
      mylog(LOG_WARNING,"create_udp_socket: inet_pton(%s:%d) return %d,error:%s\n",addr,port,r,strerror(errno));
      return -1;
    }
    r = connect(fd,(struct sockaddr*)&saddr,len);
    if(r<0){
      mylog(LOG_WARNING,"create_udp_socket:fd connect failed:%s\n",strerror(errno));
      return -1;
    }
  }
  return fd;
}