提问人:coconut 提问时间:4/23/2013 最后编辑:selbiecoconut 更新时间:2/28/2017 访问量:26896
sockaddr_in变量的存储大小未知
Storage size of sockaddr_in variable isn't known
问:
我有一段很久以前曾经在某个环境中工作的代码。我很确定这是一台 FreeBSD 机器,所以我得到了 FreeBSD 8.3,我正在尝试制作这个文件,但它不起作用。
当我尝试编译它时,它抱怨:
f.c: In function 'tcp'>
f.c:24: error: storage size of 'socket_stru' isn't known
f.c:29: error: 'IPPROTO_TCP' undeclared (first use in this function)
...
我一直在环顾四周,我看到这些都在 sys/socket.h 文件中指定。这是我的实际文件:
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include "f.h"
int tcp4 (in_addr_t ip, int port, int qsize )
{
struct sockaddr_in socket_stru; // line 24
socket_stru.sin_family = AF_INET;
socket_stru.sin_port = htons(port);
socket_stru.sin_addr.s_addr = ip;
int actual_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // line 29
...
我觉得我的代码不知何故没有“读取”sys/socket.h 文件,所以它不知道socket_stru和IPPROTO_TCP,但我真的很迷路。
有什么想法吗?
答:
8赞
selbie
4/23/2013
#1
我将您的代码剪切并粘贴到文件中(仅删除 #include f.h 并关闭函数调用。它在 Linux 上编译得很好。
我怀疑 BSD 上可能存在头文件差异。对于套接字编程,我通常包含所有这些头文件。而且我知道我的套接字代码也在 BSD 上编译。我怀疑其中一个头文件引入了sockaddr_in的定义。我记得当我通过套接字代码移植到 BSD 时,我不得不显式添加其中的一些。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/time.h>
#include <stdlib.h>
#include <memory.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <stdarg.h>
/* the next two includes probably aren't relevant for you, but I typically use them all anyway */
#include <math.h>
#include <sys/termios.h>
希望这会有所帮助
评论
0赞
coconut
4/23/2013
哇。它编译了所有这些标头!现在把它们一个一个地拿出来,直到我知道是哪一个。谢谢!!
2赞
bhakku
4/10/2017
它。更多细节在这里给出: cas.mcmaster.ca/~qiao/courses/cs3mh3/tutorials/socket.html#include <netinet/in.h>
5赞
slmyers
3/18/2015
#2
我遇到了同样的问题,但以下内容包括为我解决了这个问题
#include <arpa/inet.h>
13赞
aanrv
2/20/2016
#3
其他答案都不适合我。在查看了文件内部后,我什至没有看到 .sys/socket.h
struct sockaddr_in
对我有用的是使用相应类型时对以下文件之一:#include
struct sockaddr_*
- 如果您使用的是 ,
struct sockaddr_in
#include <netinet/in.h>
- 如果您使用的是 ,
struct sockaddr_un
#include <sys/un.h>
- 如果您使用的是 ,
struct sockaddr_ns
#include <netns/ns.h>
- 如果您使用的是 ,
struct sockaddr_ndd
#include <sys/ndd_var.h>
有关套接字编程头文件的更多信息,请参见此处。
2赞
pmg
2/20/2016
#4
根据 freebsd 开发者手册,您需要
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
4赞
jetman
3/11/2016
#5
只需添加到您的来源,您就可以开始了。#include <resolv.h>
评论