我可以在不包含的情况下使用C套接字吗? 我正在开发一个简单的C++程序,希望使用C套接字。是否可以通过在extern C内部声明而不是包含
我们可以使用extern C来声明libc绑定,例如write: 外部C{ int writeint fd,const char*buf,int count; }; 但是,当声明所需的套接字函数时,结果是不可靠的。我发现我可以创建套接字并设置选项,但是连接总是超时 下面是一个使用纯外部C声明的示例我可以在不包含的情况下使用C套接字吗? 我正在开发一个简单的C++程序,希望使用C套接字。是否可以通过在extern C内部声明而不是包含,c++,c,sockets,C++,C,Sockets,我们可以使用extern C来声明libc绑定,例如write: 外部C{ int writeint fd,const char*buf,int count; }; 但是,当声明所需的套接字函数时,结果是不可靠的。我发现我可以创建套接字并设置选项,但是连接总是超时 下面是一个使用纯外部C声明的示例 gcc extern.cpp -o extern ; ./extern 外部C{ 结构宿主{ char*h_名称; 字符**h_别名; int h_addrtype; int h_长度; 字符**地
gcc extern.cpp -o extern ; ./extern
外部C{
结构宿主{
char*h_名称;
字符**h_别名;
int h_addrtype;
int h_长度;
字符**地址列表;
};
定义h_地址h_地址列表[0]
地址中的结构{
无符号长s_地址;
};
结构sockaddr{
未签名的短萨乌族;
char sa_数据[14];
};
结构sockaddr\u in{
小仙姑家族;
无符号短sinu端口;
结构输入地址sin地址;
char sin_zero[8];
};
void*memsetvoid*,int,长无符号int;
void*memcpyvoid*,常量void*,长无符号整数;
int writeint,const char*,int;
int closeint;
hostent*gethostbynameconst char*;
int socketint,int,int;
int connectint,sockaddr*,int;
int sendint,const char*,int,int;
int recvint,char*,int,int;
int getsockoptint,int,int,void*,unsigned int*;
int setsockoptint,int,int,const void*,unsigned int;
无符号短路至无符号短路;
void perrorconst char*;
无效存在;
定义AF_INET 2
定义SOCK_流1
定义TCP_节点延迟1
定义TCP\u SYNCNT 7
定义IPPROTO_TCP 6
};
void errorconst char*s{
佩罗斯;
出口1;
}
int main{
霍森特*惠普;
int节点长度=1;
int-sockfd;
服务地址中的结构sockaddr\u;
如果sockfd=socketAF\u INET、SOCK\u STREAM、IPPROTO\u TCP<0{
错误插座;
}
setsockoptsockfd、IPPROTO_TCP、TCP_节点长度、常量字符*&节点长度、大小查找;
memset&serv_addr,'0',sizeofserv_addr;
serv_addr.sin_family=AF_INET;
serv_addr.sin_端口=htons80;
ifhp=gethostbynamestackoverflow.com==0{
errorgethostbyname;
}
memcpy&serv_addr.sin_addr,hp->h_addr,hp->h_length;
//减少sock超时
int synRetries=2;
设置sockoptsockfd、IPPROTO_TCP、TCP_SYNCNT和syntries、sizeofsyntries;
//使用extern C时,这似乎超时了
如果连接sockfd、sockaddr*&服务地址,则大小构造sockaddr\u in<0{
闭合sockfd;
错误连接;
}
sendsockfd,GET/HTTP/1.1\r\n\r\n\0,19,0;
char-buf[1024];
recvsockfd,buf,1024,0;
写入0,buf,1024;
闭合sockfd;
返回0;
}
我希望connect函数能够解决这个问题;但是,除非包括连接,否则连接将超时
有没有办法解决这个问题,我想看看是否有可能使用纯extern C处理套接字。您似乎从gethostbyname获得了IPv6地址,并将其写入sockaddr,导致缓冲区溢出和垃圾。然后,您尝试将IPv6地址的前导部分作为IPv4地址连接,但该IP不想与您通话 此外,这一行是疯狂的,但我不明白为什么它会失败: memset&serv_addr,'0',sizeofserv_addr 应该是
memset&serv_addr,0,sizeofserv_addr您可以在extern C{…}中包含include原则上,是的,您可以直接声明所有需要的函数和常量,前者带有C链接,而不包括sys/socket.h,但为什么这样做呢?实际上,使用不止一个标题来覆盖您列出的所有函数既安全又容易。把它包含在一个外部C块中。你从哪里得到int connectint,sockaddr*,int;从…起那根本不符合标准。为什么要这样做?定义了sys/Socket .h的最小内容,明确地说,可以将这个头和它从C++定义的所有其他头包含在内。所以你不需要这么做。你为什么要这样做?@zwol:也许是为了准备制作另一种语言的绑定库而做的练习?这是他应该能够做到的。