/* Performs a bind(2) call based on the provided information. The host is optional * (if it is not given, INADDR_ANY is assumed). The port is mandatory. */ int netcat_bind(int sock, nc_domain_t domain, const nc_host_t *addr, const nc_port_t *port) { struct sockaddr *my_addr; unsigned int my_addr_len; int ret; prepare_sockaddr(domain, addr, port, &my_addr, &my_addr_len); /* bind it to the specified address (can be INADDY_ANY) */ ret = bind(sock, my_addr, my_addr_len); free(my_addr); return ret; }
/* Performs a connect(2) call based on the provided information. Host and port * are both mandatory. */ int netcat_connect(int sock, nc_domain_t domain, const nc_host_t *addr, const nc_port_t *port) { struct sockaddr *rem_addr; unsigned int rem_addr_len; int ret; assert(addr); prepare_sockaddr(domain, addr, port, &rem_addr, &rem_addr_len); ret = connect(sock, rem_addr, rem_addr_len); free(rem_addr); return ret; }
int create_connection(uint32_t ip,uint16_t port) { int fd = socket(AF_INET,SOCK_STREAM,0); if(fd < 0) { xlog2("create_connection[%0X:%i]: socket: %s",ip,port,strerror(errno)); return -1; } int flags; if (-1 == (flags = fcntl(fd, F_GETFL, 0))) flags = 0; fcntl(fd, F_SETFL, flags | O_NONBLOCK); sockaddr_in addr = prepare_sockaddr(ip,port); int ret = connect(fd,(struct sockaddr*)&addr,sizeof(addr)); if( ret < 0 && errno != EINPROGRESS) { close(fd); xlog2("connect[%0X:%i]: %s",ip,port,strerror(errno)); return -2; } return fd; }