⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socket.h

📁 OpenVPN is a robust and highly flexible tunneling application that uses all of the encryption, authe
💻 H
📖 第 1 页 / 共 2 页
字号:
    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 + -