存储在sockaddr_in结构中的类型无法识别

时间:2013-11-22 15:13:13

标签: c sockets types

我在C编程方面相对较新,特别是在套接字编程方面,但是我花了很多时间试图帮助自己解决这个问题并且没有找到任何东西,我希望有人能够提供帮助。所以这就是问题(我只写了我遇到问题的那一行)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
typedef int SOCKET;

static const int SOCKET_ERROR = -1;

/*Variables initialisation*/
int32_t filtersize1=0;
int32_t filtersize2=0;
SOCKET sock;
unsigned int bytes_sent = 0;
int success = TRUE;
int erreur2=0;
int erreur3=0;


static char const *DEF_HOST_IP = "132.166.142.227"/* default target host address*/
static const unsigned short DEF_HOST_PORT = 15000;          /* default target port */
struct sockaddr_in hostinfo;

/* Store TCP/IP parameters */
hostinfo.sin_family = AF_INET;
hostinfo.sin_addr.s_addr = inet_addr( *DEF_HOST_IP);
hostinfo.sin_port = htons( DEF_HOST_PORT);

当我编译时,我得到错误“预期的构造函数,析构函数或类型转换''。'令牌“,以及我填充sockadrr_in结构的行(名为hostinfo)我的猜测是代码不能将sockadrr_in识别为结构类型,或者不识别存储在此结构中的类型,但我已经在另一台机器上使用此代码,它正在工作。我确切地说我之前已经尝试将结构设置为零并且我遇到了同样的问题。如果有人有解决方案,这对我有帮助,因为我不知道该怎么办。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以按以下方式初始化结构:

// compiles
struct sockaddr_in hostinfo = {
     .sin_family = AF_INET
};

但是只要添加函数调用,它就不再有效,因为元素不再是常量。对于编译器,添加此函数调用意味着该元素不是常量,因此它不知道要为全局对象存储什么。

// does not compile
struct sockaddr_in hostinfo = {
     .sin_family = AF_INET,
     .sin_port = htons(DEF_HOST_PORT),
};

此外,行中缺少分号:

static char const *DEF_HOST_IP = "132.166.142.227"

关于@ klas-lindback所说的内容,你应该在某个地方初始化hostinfo作为函数的一部分。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>

static char const *DEF_HOST_IP = "132.166.142.227"; /* default target host address*/
static const unsigned short DEF_HOST_PORT = 15000;  /* default target port */
struct sockaddr_in hostinfo;

void setup_hostinfo()
{
    /* Store TCP/IP parameters */
    hostinfo.sin_family      = AF_INET;
    hostinfo.sin_addr.s_addr = inet_addr(DEF_HOST_IP);
    hostinfo.sin_port        = htons(DEF_HOST_PORT);
}

int main(void) {

    /* setup our hostinfo */
    setup_hostinfo();

    return 0;
}

答案 1 :(得分:1)

在函数体外只允许声明。

行:

/* Store TCP/IP parameters */
hostinfo.sin_family = AF_INET;
hostinfo.sin_addr.s_addr = inet_addr( *DEF_HOST_IP);
hostinfo.sin_port = htons( DEF_HOST_PORT);

不是声明,必须放在函数中。