create_UDP_socket(char *ip, int port, int type)
{
struct sockaddr_in addr;
int sockfd;
int on_off = 1;
addr.sin_family = AF_INET;
if (ip == NULL) {
addr.sin_addr.s_addr = htonl(INADDR_ANY);
}
else {
addr.sin_addr.s_addr = inet_addr(ip);
}
addr.sin_port = htons(port);
if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
return(-1);
}
fcntl(sockfd, F_SETFD, FD_CLOEXEC);
if(type == 0) {//listener
setsockopt(sockfd,SOL_SOCKET, SO_REUSEADDR, (const void *)&on_off, sizeof(on_off));
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
close(sockfd);
return(-1);
}
}
else {//sender
if(connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
close(sockfd);
return(-1);
}
}
return(sockfd);
}