Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在不包含的情况下使用C套接字吗? 我正在开发一个简单的C++程序,希望使用C套接字。是否可以通过在extern C内部声明而不是包含_C++_C_Sockets - Fatal编程技术网

我可以在不包含的情况下使用C套接字吗? 我正在开发一个简单的C++程序,希望使用C套接字。是否可以通过在extern 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_长度; 字符**地

我们可以使用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_长度; 字符**地址列表; }; 定义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:也许是为了准备制作另一种语言的绑定库而做的练习?这是他应该能够做到的。