【问题标题】:Change socklen_t int to uint32_t in sys/socket.h在 sys/socket.h 中将 socklen_t int 更改为 uint32_t
【发布时间】: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


【解决方案1】:

更改系统包含是一个坏主意,因为系统的其余部分肯定依赖于其中的原型/类型定义/声明/定义的内容。

所以调整明显不可移植的库代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2015-12-21
    • 2021-08-15
    • 2011-02-26
    • 2016-07-13
    • 2015-12-12
    • 1970-01-01
    相关资源
    最近更新 更多