打开一个 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;
}