在sys / socket.h中将socklen_t int更改为uint32_t

时间:2014-06-19 23:29:01

标签: c sockets android-ndk

我在库中的socklen_t有一个冲突的typedef我正在尝试构建来自ndk-path / platforms / android-19 / arch-arm / usr / include / sys / socket.h的包含文件。

库有typedef uint32_t socklen_t但包含sys / socket.h,它将typedefs为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 */

1 个答案:

答案 0 :(得分:2)

更改系统包含是一个坏主意,因为系统的其余部分肯定依赖于那里的protoyped / typdefed / declaned / definded。

因此,调整明显不可移植的库代码。