gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:02 26 4
gpt4 key购买 nike

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

该库有 typedef uint32_t socklen_t 但包括 sys/socket.h,它将其类型定义为 int。我可以让库使用 sys/socket.h 版本 (int) 或在 socket.h header 中重新定义它(如下所示)。哪个更安全?我试着联系图书馆的作者,但没有回应。更改 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 */

最佳答案

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

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

关于在 sys/socket.h 中将 socklen_t int 更改为 uint32_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24317791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com