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

📄 socket.h

📁 postgresql-odbc,跨平台应用
💻 H
字号:
/* File:			socket.h * * Description:		See "socket.c" * * Comments:		See "notice.txt" for copyright and license information. * */#ifndef __SOCKET_H__#define __SOCKET_H__#include "psqlodbc.h"#include <errno.h>#ifndef WIN32#define	WSAAPI#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#include <fcntl.h>#include <netdb.h>#include <netinet/in.h>#include <arpa/inet.h>#define closesocket(xxx) close(xxx)#define SOCKETFD int#ifndef		  INADDR_NONE#ifndef _IN_ADDR_T#define _IN_ADDR_Ttypedef unsigned int in_addr_t;#endif /* _IN_ADDR_T */#define INADDR_NONE ((in_addr_t)-1)#endif /* _IN_ADDR_NONE */#define SOCK_ERRNO	errno#define SOCK_ERRNO_SET(e)	(errno = e)#ifdef	HAVE_SYS_UN_H#define HAVE_UNIX_SOCKETS#endif /* HAVE_SYS_UN_H */#else#include <winsock2.h>#include <ws2tcpip.h>#if defined(_MSC_VER) && (_MSC_VER < 1300)/* *      The order of the structure elements on Win32 doesn't match the *      order specified in the standard, but we have to match it for *      IPv6 to work. */#define AI_PASSIVE     0x1  // Socket address will be used in bind() call.#define AI_CANONNAME   0x2  // Return canonical name in first ai_canonname.#define AI_NUMERICHOST 0x4  // Nodename must be a numeric address string.#define NI_NUMERICHOST	1#define _SS_MAXSIZE 128#define _SS_ALIGNSIZE (sizeof(__int64))#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short))#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) + _SS_PAD1SIZE + _SS_ALIGNSIZE))typedef int socklen_t;struct sockaddr_storage {	short ss_family;	char __ss_pad1[_SS_PAD1SIZE];	__int64 __ss_align;	char __ss_pad2[_SS_PAD2SIZE];};struct addrinfo{	int		ai_flags;	int		ai_family;	int		ai_socktype;	int		ai_protocol;	size_t	ai_addrlen;	char	*ai_canonname;	struct sockaddr *ai_addr;	struct addrinfo *ai_next;};#endif /* _MSC_VER */#define SOCKETFD SOCKET#define SOCK_ERRNO		(WSAGetLastError())#define SOCK_ERRNO_SET(e)	WSASetLastError(e)#ifndef	EWOULDBLOCK#define	EWOULDBLOCK	WSAEWOULDBLOCK#endif /* EWOULDBLOCK */#ifndef	ECONNRESET#define	ECONNRESET	WSAECONNRESET#endif /* ECONNRESET */#ifndef	EINPROGRESS#define	EINPROGRESS	WSAEINPROGRESS#endif /* EINPROGRESS */#endif /* WIN32 */typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo *); typedef int (WSAAPI *getaddrinfo_func) (const char *, const char *,	const struct addrinfo *, struct addrinfo **); typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr *,	socklen_t, char *, size_t, char *, size_t, int);#define SOCKET_ALREADY_CONNECTED		1#define SOCKET_HOST_NOT_FOUND			2#define SOCKET_COULD_NOT_CREATE_SOCKET		3#define SOCKET_COULD_NOT_CONNECT		4#define SOCKET_READ_ERROR			5#define SOCKET_WRITE_ERROR			6#define SOCKET_NULLPOINTER_PARAMETER		7#define SOCKET_PUT_INT_WRONG_LENGTH		8#define SOCKET_GET_INT_WRONG_LENGTH		9#define SOCKET_CLOSED				10#define SOCKET_READ_TIMEOUT			11#define SOCKET_WRITE_TIMEOUT			12struct SocketClass_{	int			buffer_size;	int			buffer_filled_in;	int			buffer_filled_out;	int			buffer_read_in;	UCHAR *buffer_in;	UCHAR *buffer_out;	SOCKETFD	socket;	unsigned int	pversion;	int		reslen;	char		*_errormsg_;	int		errornumber;	int		sadr_len;	struct sockaddr_storage sadr_area; /* Used for various connections */	/* SSL stuff */	void		*ssl;		/* libpq ssl */	void		*pqconn;	/* libpq PGConn */	BOOL		via_libpq;	/* using libpq library ? */	char		reverse;		/* used to handle Postgres 6.2 protocol								 * (reverse byte order) */};#define SOCK_get_char(self)		(SOCK_get_next_byte(self))#define SOCK_put_char(self, c)	(SOCK_put_next_byte(self, c))/* error functions */#define SOCK_get_errcode(self)	(self ? self->errornumber : SOCKET_CLOSED)#define SOCK_get_errmsg(self)	(self ? self->_errormsg_ : "socket closed")/* *	code taken from postgres libpq et al. */#ifndef WIN32#define DEFAULT_PGSOCKET_DIR	"/tmp"#define UNIXSOCK_PATH(sun, port, defpath) \	snprintf((sun)->sun_path, sizeof((sun)->sun_path), "%s/.s.PGSQL.%d", \		((defpath) && *(defpath) != '\0') ? (defpath) : \			DEFAULT_PGSOCKET_DIR, \			(port))/* *	We do this because sun_len is in BSD's struct, while others don't. *	We never actually set BSD's sun_len, and I can't think of a *	platform-safe way of doing it, but the code still works. bjm */#ifndef	offsetof#define offsetof(type, field)	((long) &((type *)0)->field)#endif /* offsetof */#if defined(SUN_LEN)#define UNIXSOCK_LEN(sun) SUN_LEN(sun)#else#define UNIXSOCK_LEN(sun) \	(strlen((sun)->sun_path) + offsetof(struct sockaddr_un, sun_path))#endif /* SUN_LEN */#endif /* WIN32 *//* *	END code taken from postgres libpq et al. *//* Socket prototypes */SocketClass *SOCK_Constructor(const ConnectionClass *conn);void		SOCK_Destructor(SocketClass *self);char		SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname, long timeout);int		SOCK_get_id(SocketClass *self);void		SOCK_get_n_char(SocketClass *self, char *buffer, Int4 len);void		SOCK_put_n_char(SocketClass *self, const char *buffer, Int4 len);BOOL		SOCK_get_string(SocketClass *self, char *buffer, Int4 bufsize);void		SOCK_put_string(SocketClass *self, const char *string);int		SOCK_get_int(SocketClass *self, short len);void		SOCK_put_int(SocketClass *self, int value, short len);Int4		SOCK_flush_output(SocketClass *self);UCHAR		SOCK_get_next_byte(SocketClass *self);void		SOCK_put_next_byte(SocketClass *self, UCHAR next_byte);Int4		SOCK_get_response_length(SocketClass *self);void		SOCK_clear_error(SocketClass *self);UInt4		SOCK_skip_n_bytes(SocketClass *self, UInt4 skip_length);#endif /* __SOCKET_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -