【发布时间】:2014-06-19 23:29:00
【问题描述】:
我正在尝试构建的库中 socklen_t 的 typedef 存在冲突,并且包含来自 ndk-path/platforms/android-19/arch-arm/usr/include/sys/socket.h 的文件。
该库有typedef uint32_t socklen_t,但包括 sys/socket.h,它将其 typedef 为 int。我可以使库使用 sys/socket.h 版本(int)或在 socket.h 标头中重新定义它(如下所示)。哪个更安全?我尝试联系图书馆的作者,但没有回应。更改 socket.h 中的定义安全吗?
#ifndef _SYS_SOCKET_H_
#define _SYS_SOCKET_H_
#include <sys/cdefs.h>
#include <sys/types.h>
#include <cstdint>
#include <linux/socket.h>
__BEGIN_DECLS
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define SOCK_RAW 3
#define SOCK_RDM 4
#define SOCK_SEQPACKET 5
#define SOCK_PACKET 10
#ifdef __i386__
# define __socketcall extern __attribute__((__cdecl__))
#else
# define __socketcall extern
#endif
/* BIONIC: second argument to shutdown() */
enum {
SHUT_RD = 0, /* no more receptions */
#define SHUT_RD SHUT_RD
SHUT_WR, /* no more transmissions */
#define SHUT_WR SHUT_WR
SHUT_RDWR /* no more receptions or transmissions */
#define SHUT_RDWR SHUT_RDWR
};
typedef uint32_t socklen_t;
__socketcall int socket(int, int, int);
__socketcall int bind(int, const struct sockaddr *, int);
__socketcall int connect(int, const struct sockaddr *, socklen_t);
__socketcall int listen(int, int);
__socketcall int accept(int, struct sockaddr *, socklen_t *);
__socketcall int getsockname(int, struct sockaddr *, socklen_t *);
__socketcall int getpeername(int, struct sockaddr *, socklen_t *);
__socketcall int socketpair(int, int, int, int *);
__socketcall int shutdown(int, int);
__socketcall int setsockopt(int, int, int, const void *, socklen_t);
__socketcall int getsockopt(int, int, int, void *, socklen_t *);
__socketcall int sendmsg(int, const struct msghdr *, unsigned int);
__socketcall int recvmsg(int, struct msghdr *, unsigned int);
extern ssize_t send(int, const void *, size_t, unsigned int);
extern ssize_t recv(int, void *, size_t, unsigned int);
__socketcall ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t);
__socketcall ssize_t recvfrom(int, void *, size_t, unsigned int, const struct sockaddr *, socklen_t *);
#undef __socketcall
__END_DECLS
#endif /* _SYS_SOCKET_H */
【问题讨论】:
-
您需要匹配库在编译时认为
socklen_t的任何内容,否则您将收到未解决的符号链接器错误。如果您确实更改了某些内容,它可能必须在该库中,并且您需要重新编译它。 -
你确定你应该包括这个文件,而不仅仅是普通的“socket.h”吗?
标签: c sockets android-ndk