求助:AIX系统调用到#include 头文件时报错

时间:2022-08-19 15:49:10
AIX系统,用g++编译cpp文件时,如果cpp文件中包含#include <netinet/in.h>,编译时会报如下错误:
In file included from socket.h:15,
                 from dbserver.h:5,
                 from test.cpp:1:
/usr/include/netinet/in.h:804: parse error before `.'
这些都是涉及到in.h这个文件的,求助,这个问题应该如何解决。
ps:在linux系统下,编译没有问题。

9 个解决方案

#1


是不是你编译器支持的C语言标准不一样啊,检查编译器的版本吧

#2


sys/socket.h 怎么会include netinet/in.h呢
难道socket.h不是系统的头文件?

#3


引用 2 楼 mymtom 的回复:
sys/socket.h 怎么会include netinet/in.h呢
难道socket.h不是系统的头文件?

socket.h是自己写的文件,不是系统的。

#4


引用 1 楼 kuzuozhou 的回复:
是不是你编译器支持的C语言标准不一样啊,检查编译器的版本吧

怎么判断是不是标准一致啊?菜鸟求详解。

#5


就是检查g++的版本啊,linux里面是类似g++ -v 查看啊,你看看AIX系统里的版本是不是和linux里面不一样,有可能是编译器的问题哦

#6


引用 3 楼 fuyun10036 的回复:
引用 2 楼 mymtom 的回复:sys/socket.h 怎么会include netinet/in.h呢
难道socket.h不是系统的头文件?
socket.h是自己写的文件,不是系统的。

不要这样子吧。
Unix系统有一个sys/socket.h的头文件,最好还是改个名字吧。
要不把你自己的socket.h贴一下吧。

#7


引用 6 楼 mymtom 的回复:
引用 3 楼 fuyun10036 的回复:引用 2 楼 mymtom 的回复:sys/socket.h 怎么会include netinet/in.h呢
难道socket.h不是系统的头文件?
socket.h是自己写的文件,不是系统的。
不要这样子吧。
Unix系统有一个sys/socket.h的头文件,最好还是改个名字吧。
要不把你自己的socket.h贴……


#ifndef __SOCKET_H__
#define __SOCKET_H__

#include <sys/types.h>
#include <stdio.h>
#include <string.h>

#ifdef  WIN32 
#include <winsock2.h>
#include "thread.h"
#pragma comment(lib, "ws2_32.lib")
#else
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<sys/ioctl.h>
#include <errno.h>
    typedef unsigned int   SOCKET;
#endif

enum Type {TCP = SOCK_STREAM, UDP = SOCK_DGRAM};

typedef struct sockaddr   SOCKADDR;
typedef struct sockaddr_in SOCKADDR_IN;

#define  SOCK_CLOSE "DD9B2ADDDEEF46AA8460ED357E47DF84"
 
//socket运行环境单件类
class CSocketEnv 
{
public:

#ifdef WIN32
 WSADATA *g_pWsaData; //socket运行环境
#endif

CSocketEnv();
~CSocketEnv();
static CSocketEnv* Instance();
static int Uninstance();

private:
static  CSocketEnv* _this;

};
//socket 公用通信类
class CMySocket 
{

public:
  CMySocket();
  virtual ~CMySocket();

  SOCKET Create(int nType=TCP);
  int GetHostName(char *hostname);
  int GetHostIp(char *hostip,int nIndex=0);
  int GetRemoteIp(struct in_addr addr, char *hostip);
  
  int Connect(SOCKET skt,const char *ip, int port);
  int Close(SOCKET skt);
  int Bind(SOCKET skt,int port);
  int Listen(SOCKET skt,int backlog = 5);
  SOCKET Accept(SOCKET skt,SOCKADDR_IN *addr);

  int Send(SOCKET skt,const char* buf, int len = -1, int flags = 0);
  int Recv(SOCKET skt, char* buf, int len, int flags = 0);

  int Sendn(SOCKET skt,const char *buf , int nLen, int flags = 0);
  int Recvn(SOCKET skt,char *buf, int nLen, int flags = 0);
 
  //UDP
  int SendTo(SOCKET skt,char *ip, int port,const char* buf, int len = -1, int flags = 0);
  int RecvFrom( SOCKET skt,char *buf, int len, int flags = 0);
  
  int IoctlSocket(SOCKET skt,int nCmd);
  int SetSockOpt(SOCKET skt,int nLevel,int nOptName,const char* sOptVal,int nOptLen);
  int GetLastError();
  int GetErrCodeMsg(char *sErrMsg = NULL);

};

//客户端类
class CSocketClient : public CMySocket
{
public:

SOCKET m_socketId;

CSocketClient();
~CSocketClient();

int Connect(const char *ip, int port);
int Close();

int Send(const char* buf, int len = -1, int flags = 0);
int Recv(char* buf, int len, int flags = 0);

int Sendn(const char* buf, int len = -1, int flags = 0);
int Recvn(char* buf, int len, int flags = 0);

int SendTo(char *ip, int port,const char* buf, int len = -1, int flags = 0);

int RecvFrom(char *buf, int len, int flags = 0);
int ReConnect();
int IoctlSocket(int nCmd);

private:
char m_sRemoteIp[16];
int m_nPort;
};

#endif

#8


真没有看出什么大的问题,楼主试试这样行不行
#include <netinet/in.h>
把放到
的后面
#include <sys/socket.h>

我一般是用下面的顺序
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>



#9


真没有看出什么大的问题,楼主试试这样行不行
#include <netinet/in.h>
把放到
#include <sys/socket.h>
的后面

我一般是用下面的顺序
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#1


是不是你编译器支持的C语言标准不一样啊,检查编译器的版本吧

#2


sys/socket.h 怎么会include netinet/in.h呢
难道socket.h不是系统的头文件?

#3


引用 2 楼 mymtom 的回复:
sys/socket.h 怎么会include netinet/in.h呢
难道socket.h不是系统的头文件?

socket.h是自己写的文件,不是系统的。

#4


引用 1 楼 kuzuozhou 的回复:
是不是你编译器支持的C语言标准不一样啊,检查编译器的版本吧

怎么判断是不是标准一致啊?菜鸟求详解。

#5


就是检查g++的版本啊,linux里面是类似g++ -v 查看啊,你看看AIX系统里的版本是不是和linux里面不一样,有可能是编译器的问题哦

#6


引用 3 楼 fuyun10036 的回复:
引用 2 楼 mymtom 的回复:sys/socket.h 怎么会include netinet/in.h呢
难道socket.h不是系统的头文件?
socket.h是自己写的文件,不是系统的。

不要这样子吧。
Unix系统有一个sys/socket.h的头文件,最好还是改个名字吧。
要不把你自己的socket.h贴一下吧。

#7


引用 6 楼 mymtom 的回复:
引用 3 楼 fuyun10036 的回复:引用 2 楼 mymtom 的回复:sys/socket.h 怎么会include netinet/in.h呢
难道socket.h不是系统的头文件?
socket.h是自己写的文件,不是系统的。
不要这样子吧。
Unix系统有一个sys/socket.h的头文件,最好还是改个名字吧。
要不把你自己的socket.h贴……


#ifndef __SOCKET_H__
#define __SOCKET_H__

#include <sys/types.h>
#include <stdio.h>
#include <string.h>

#ifdef  WIN32 
#include <winsock2.h>
#include "thread.h"
#pragma comment(lib, "ws2_32.lib")
#else
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<sys/ioctl.h>
#include <errno.h>
    typedef unsigned int   SOCKET;
#endif

enum Type {TCP = SOCK_STREAM, UDP = SOCK_DGRAM};

typedef struct sockaddr   SOCKADDR;
typedef struct sockaddr_in SOCKADDR_IN;

#define  SOCK_CLOSE "DD9B2ADDDEEF46AA8460ED357E47DF84"
 
//socket运行环境单件类
class CSocketEnv 
{
public:

#ifdef WIN32
 WSADATA *g_pWsaData; //socket运行环境
#endif

CSocketEnv();
~CSocketEnv();
static CSocketEnv* Instance();
static int Uninstance();

private:
static  CSocketEnv* _this;

};
//socket 公用通信类
class CMySocket 
{

public:
  CMySocket();
  virtual ~CMySocket();

  SOCKET Create(int nType=TCP);
  int GetHostName(char *hostname);
  int GetHostIp(char *hostip,int nIndex=0);
  int GetRemoteIp(struct in_addr addr, char *hostip);
  
  int Connect(SOCKET skt,const char *ip, int port);
  int Close(SOCKET skt);
  int Bind(SOCKET skt,int port);
  int Listen(SOCKET skt,int backlog = 5);
  SOCKET Accept(SOCKET skt,SOCKADDR_IN *addr);

  int Send(SOCKET skt,const char* buf, int len = -1, int flags = 0);
  int Recv(SOCKET skt, char* buf, int len, int flags = 0);

  int Sendn(SOCKET skt,const char *buf , int nLen, int flags = 0);
  int Recvn(SOCKET skt,char *buf, int nLen, int flags = 0);
 
  //UDP
  int SendTo(SOCKET skt,char *ip, int port,const char* buf, int len = -1, int flags = 0);
  int RecvFrom( SOCKET skt,char *buf, int len, int flags = 0);
  
  int IoctlSocket(SOCKET skt,int nCmd);
  int SetSockOpt(SOCKET skt,int nLevel,int nOptName,const char* sOptVal,int nOptLen);
  int GetLastError();
  int GetErrCodeMsg(char *sErrMsg = NULL);

};

//客户端类
class CSocketClient : public CMySocket
{
public:

SOCKET m_socketId;

CSocketClient();
~CSocketClient();

int Connect(const char *ip, int port);
int Close();

int Send(const char* buf, int len = -1, int flags = 0);
int Recv(char* buf, int len, int flags = 0);

int Sendn(const char* buf, int len = -1, int flags = 0);
int Recvn(char* buf, int len, int flags = 0);

int SendTo(char *ip, int port,const char* buf, int len = -1, int flags = 0);

int RecvFrom(char *buf, int len, int flags = 0);
int ReConnect();
int IoctlSocket(int nCmd);

private:
char m_sRemoteIp[16];
int m_nPort;
};

#endif

#8


真没有看出什么大的问题,楼主试试这样行不行
#include <netinet/in.h>
把放到
的后面
#include <sys/socket.h>

我一般是用下面的顺序
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>



#9


真没有看出什么大的问题,楼主试试这样行不行
#include <netinet/in.h>
把放到
#include <sys/socket.h>
的后面

我一般是用下面的顺序
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>