口值传入
memcpy(&;amp;listen_sock.local_host, memcpy(&;amp;listen_sock.local_port,
&;amp;local_host, sizeof(listen_sock.local_host)); &;amp;local_port, sizeof(listen_sock.local_port));
memcpy(&;amp;listen_sock.host, &;amp;remote_host, sizeof(listen_sock.host)); 然后通过 core_listen(&;listen_sock)函数进行监听: 原型:int core_listen(nc_sock_t *ncsock), assert(ncsock);if (ncsock-&;gt;proto == NETCAT_PROTO_TCP) //根据 socket 协议不 同,调用不同的 //监听函数 return ncsock-&;gt;fd = core_tcp_listen(ncsock); else if (ncsock-&;gt;proto ==
NETCAT_PROTO_UDP) return ncsock-&;gt;fd = core_udp_listen(ncsock); else abort(); return -1; 原型:static int core_tcp_listen(nc_sock_t *ncsock) int sock_listen, sock_accept, timeout = ncsock-&;gt;timeout;sock_listen netcat_socket_new_listen(PF_INET, &;amp;ncsock-&;gt;local_host.iaddrs[0], ncsock-&;gt;local_port.netnum); 在调用 netcat_socket_new_listen 函数。 原型:int netcat_socket_new_listen(int domain, const struct in_addr *addr, in_port_t port) int sock, ret, my_family;struct sockaddr_in my_addr; memset(&;amp;my_addr, 0, sizeof(my_addr)); my_addr.sin_family = my_family; my_addr.sin_port = port; if (addr) memcpy(&;amp;my_addr.sin_addr, addr, sizeof(my_addr.sin_addr)); //将 my_addr 重新填充 sock = netcat_socket_new(domain, SOCK_STREAM); //真正创建一个 socket 代码结构3
=
原型:int netcat_socket_new(int domain, int type) int sock, ret, sockopt;struct linger fix_ling; sock = socket(domain, type, 0); if (sock &;lt; 0) return -1; ret = setsockopt(sock, SOL_SOCKET, SO_LINGER, &;amp;fix_ling, sockopt = 1; ret = setsockopt(sock, sizeof(sockopt)); SOL_SOCKET, SO_REUSEADDR, &;amp;sockopt, sizeof(fix_ling)); //创建一个 socket
return sock; 我们再回到代码结构3中,继续。接代码结构3。 sock = netcat_socket_new(domain, SOCK_STREAM); if (sock &;lt; 0) return sock; /* forward the error code */ /* bind it to the specified address (can be INADDY_ANY) */ //
绑定 socket 到地址 ret = bind(sock, (struct sockaddr *)&;amp;my_addr, sizeof(my_addr)); //监听端口,4个 backlog /* now make it listening, with a reasonable backlog value */ ret = listen(sock, 4); return sock; 至此,建立 socket,绑定地址,监听完成。 这个创建监听的过程中,调用顺序为: Core_listenàcore_t
cp_listenà netcat_socket_new_listenànetcat_socket_new 。 其 中 netcat_socket_new 返回创建的 socket。 我 们返回到 core_tcp_listen 中继续, 调用 sock_listen = netcat_socket_new_listen(PF_INET, &;ncsock->local_host.iaddrs[0],ncsock->local_port.netnum) 返回一个创建好的监听端口以后, 需 要 accept 调用,然后阻塞,等待连接请求的到来。 while (TRUE) {struct sockaddr_in my_addr; unsigned int my_len = sizeof(my_addr); /* this *IS* socklen_t */ sock_accept = netcat_socket_accept(sock_listen, timeout); //进入到 while 函数中, 通 过 //necat_socket_accept 进行等待 代码结构4 原型:int netcat_socket_accept(int s, int timeout) fd_set in;int ret;
static bool timeout_init = FALSE; static struct timeval timest; FD_ZERO(&;amp;in); FD_SET(s, &;amp;in); if (timeout &;gt; 0) { timest.tv_sec = timeout; timest.tv_usec = 0; timeout_init = TRUE; } //设置 timeout (timeout ? &;amp;timest : NULL)); //将创建的监听 socket 放入到 FD 描述集中
ret = select(s + 1, &;amp;in, NULL, NULL, /* have we got this connection?