// Listen TCP socket int tcp_listen(){ int sock; struct sockaddr_in sin; int val = 1; // Create socket, allocate memory and set sock options if((sock=socket(AF_INET,SOCK_STREAM,0)) < 0){ err_exit("Couldn't make socket"); } memset(&sin, 0, sizeof(sin)); sin.sin_addr.s_addr = INADDR_ANY; sin.sin_family = AF_INET; sin.sin_port = htons(PORT); setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val,sizeof(val)); if (disable_nagle == 1) set_nagle(sock, 1); // Bind to socket if(bind(sock,(struct sockaddr *)&sin, sizeof(sin))<0){ berr_exit("Couldn't bind"); } // Listen to socket listen(sock,5); // Return socket descriptor return(sock); }
// TCP connect function int tcp_connect(char *host, int port){ struct hostent *hp; struct sockaddr_in addr; int sock; // Resolve host if(!(hp = gethostbyname(host))){ berr_exit("Couldn't resolve host"); } #ifdef DEBUG printf("[DEBUG] Host %s resolved\n", host); #endif memset(&addr, 0, sizeof(addr)); addr.sin_addr = *(struct in_addr*) hp->h_addr_list[0]; addr.sin_family = AF_INET; addr.sin_port = htons(port); if((sock=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP))<0){ err_exit("Couldn't create socket"); } #ifdef DEBUG printf("[DEBUG] Socket correctly created\n"); #endif if (disable_nagle == 1) set_nagle(sock, 1); if(connect(sock,(struct sockaddr *)&addr, sizeof(addr))<0){ err_exit("Couldn't connect socket"); } #ifdef DEBUG printf("[DEBUG] Socket connected\n"); #endif /* Check solution below if we need to support a timeout -- to debug signal(SIGALRM, AlarmHandler); sTimeout = 0; alarm(CONNECT_TIMEOUT); if ( connect(sock, (struct sockaddr *) &addr, sizeof(addr)) ){ if ( sTimeout ){ err_exit("timeout connecting stream socket"); } } sTimeout = 0; alarm(CONNECT_TIMEOUT); */ return sock; }
static int np_fdtrans_write(u8 *data, u32 count, void *a) { Fdtrans *fdt; int ret; fdt = a; if ( fdt->is_tcp ) { set_nagle(fdt->fdout, 1); set_quickack(fdt->fdout, 1); } ret = write(fdt->fdout, data, count); if ( fdt->is_tcp ) { set_nagle(fdt->fdout, 0); } // fprintf(stderr, "np_fdtrans_write fd %d datalen %d count %d\n", fdt->fdout, count, ret); return ret; }