📄 socket.h
字号:
return 0;}static inline boollegal_ipv4_port (int port){ return port > 0 && port < 65536;}static inline boollink_socket_proto_connection_oriented (int proto){ return proto == PROTO_TCPv4_SERVER || proto == PROTO_TCPv4_CLIENT;}static inline boollink_socket_connection_oriented (const struct link_socket *sock){ if (sock) return link_socket_proto_connection_oriented (sock->info.proto); else return false;}static inline booladdr_defined (const struct sockaddr_in *addr){ return addr->sin_addr.s_addr != 0;}static inline booladdr_match (const struct sockaddr_in *a1, const struct sockaddr_in *a2){ return a1->sin_addr.s_addr == a2->sin_addr.s_addr;}static inline in_addr_taddr_host (const struct sockaddr_in *s){ return ntohl (s->sin_addr.s_addr);}static inline booladdr_port_match (const struct sockaddr_in *a1, const struct sockaddr_in *a2){ return a1->sin_addr.s_addr == a2->sin_addr.s_addr && a1->sin_port == a2->sin_port;}static inline booladdr_match_proto (const struct sockaddr_in *a1, const struct sockaddr_in *a2, const int proto){ return link_socket_proto_connection_oriented (proto) ? addr_match (a1, a2) : addr_port_match (a1, a2);}static inline boolsocket_connection_reset (const struct link_socket *sock, int status){ if (link_socket_connection_oriented (sock)) { if (sock->stream_reset || sock->stream_buf.error) return true; else if (status < 0) { const int err = openvpn_errno_socket (); return err == ECONNRESET; } } return false;}static inline boollink_socket_verify_incoming_addr (struct buffer *buf, const struct link_socket_info *info, const struct sockaddr_in *from_addr){ if (buf->len > 0) { if (from_addr->sin_family != AF_INET) return false; if (!addr_defined (from_addr)) return false; if (info->remote_float || !addr_defined (&info->lsa->remote)) return true; if (addr_match_proto (from_addr, &info->lsa->remote, info->proto)) return true; } return false;}static inline voidlink_socket_get_outgoing_addr (struct buffer *buf, const struct link_socket_info *info, struct sockaddr_in *addr){ if (buf->len > 0) { struct link_socket_addr *lsa = info->lsa; if (addr_defined (&lsa->actual)) { addr->sin_family = lsa->actual.sin_family; addr->sin_addr.s_addr = lsa->actual.sin_addr.s_addr; addr->sin_port = lsa->actual.sin_port; } else { link_socket_bad_outgoing_addr (); buf->len = 0; } }}static inline voidlink_socket_set_outgoing_addr (const struct buffer *buf, struct link_socket_info *info, const struct sockaddr_in *addr, const char *common_name){ if (!buf || buf->len > 0) { struct link_socket_addr *lsa = info->lsa; if ( /* new or changed address? */ (!info->connection_established || !addr_match_proto (addr, &lsa->actual, info->proto)) /* address undef or address == remote or --float */ && (info->remote_float || !addr_defined (&lsa->remote) || addr_match_proto (addr, &lsa->remote, info->proto)) ) { link_socket_connection_initiated (buf, info, addr, common_name); } }}/* * Stream buffer handling -- stream_buf is a helper class * to assist in the packetization of stream transport protocols * such as TCP. */void stream_buf_init (struct stream_buf *sb, struct buffer *buf);void stream_buf_close (struct stream_buf* sb);bool stream_buf_added (struct stream_buf *sb, int length_added);static inline boolstream_buf_read_setup (struct link_socket* sock){ bool stream_buf_read_setup_dowork (struct link_socket* sock); if (link_socket_connection_oriented (sock)) return stream_buf_read_setup_dowork (sock); else return true;}/* * Socket Read Routines */int link_socket_read_tcp (struct link_socket *sock, struct buffer *buf);#ifdef WIN32static inline intlink_socket_read_udp_win32 (struct link_socket *sock, struct buffer *buf, struct sockaddr_in *from){ return socket_finalize (sock->sd, &sock->reads, buf, from);}#elseint link_socket_read_udp_posix (struct link_socket *sock, struct buffer *buf, int maxsize, struct sockaddr_in *from);#endif/* read a TCP or UDP packet from link */static inline intlink_socket_read (struct link_socket *sock, struct buffer *buf, int maxsize, struct sockaddr_in *from){ if (sock->info.proto == PROTO_UDPv4) { int res;#ifdef WIN32 res = link_socket_read_udp_win32 (sock, buf, from);#else res = link_socket_read_udp_posix (sock, buf, maxsize, from);#endif return res; } else if (sock->info.proto == PROTO_TCPv4_SERVER || sock->info.proto == PROTO_TCPv4_CLIENT) { /* from address was returned by accept */ *from = sock->info.lsa->actual; return link_socket_read_tcp (sock, buf); } else { ASSERT (0); return -1; /* NOTREACHED */ }}/* * Socket Write routines */int link_socket_write_tcp (struct link_socket *sock, struct buffer *buf, struct sockaddr_in *to);#ifdef WIN32static inline intlink_socket_write_win32 (struct link_socket *sock, struct buffer *buf, struct sockaddr_in *to){ int err = 0; int status = 0; if (overlapped_io_active (&sock->writes)) { status = socket_finalize (sock->sd, &sock->writes, NULL, NULL); if (status < 0) err = WSAGetLastError (); } socket_send_queue (sock, buf, to); if (status < 0) { WSASetLastError (err); return status; } else return BLEN (buf);}#elsestatic inline intlink_socket_write_udp_posix (struct link_socket *sock, struct buffer *buf, struct sockaddr_in *to){ return sendto (sock->sd, BPTR (buf), BLEN (buf), 0, (struct sockaddr *) to, (socklen_t) sizeof (*to));}static inline intlink_socket_write_tcp_posix (struct link_socket *sock, struct buffer *buf, struct sockaddr_in *to){ return send (sock->sd, BPTR (buf), BLEN (buf), MSG_NOSIGNAL);}#endifstatic inline intlink_socket_write_udp (struct link_socket *sock, struct buffer *buf, struct sockaddr_in *to){#ifdef WIN32 return link_socket_write_win32 (sock, buf, to);#else return link_socket_write_udp_posix (sock, buf, to);#endif}/* write a TCP or UDP packet to link */static inline intlink_socket_write (struct link_socket *sock, struct buffer *buf, struct sockaddr_in *to){ if (sock->info.proto == PROTO_UDPv4) { return link_socket_write_udp (sock, buf, to); } else if (sock->info.proto == PROTO_TCPv4_SERVER || sock->info.proto == PROTO_TCPv4_CLIENT) { return link_socket_write_tcp (sock, buf, to); } else { ASSERT (0); return -1; /* NOTREACHED */ }}/* * Socket I/O wait functions */static inline boolsocket_read_residual (const struct link_socket *s){ return s && s->stream_buf.residual_fully_formed;}static inline event_tsocket_event_handle (const struct link_socket *s){#ifdef WIN32 return &s->rw_handle;#else return s->sd;#endif}static inline voidsocket_set (struct link_socket *s, struct event_set *es, unsigned int rwflags, void *arg){ if (s) { if (rwflags & EVENT_READ) { if (!stream_buf_read_setup (s)) rwflags &= ~EVENT_READ; } event_ctl (es, socket_event_handle (s), rwflags, arg);#ifdef WIN32 if (rwflags & EVENT_READ) socket_recv_queue (s, 0);#endif s->rwflags = rwflags; }}const char *socket_stat (const struct link_socket *s, unsigned int rwflags, struct gc_arena *gc);#endif /* SOCKET_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -