我可以在不包含 <sys/socket.h> 的情况下使用 C 套接字吗?
Can I use C sockets without including <sys/socket.h>?
我正在开发一个简单的C 程序,并希望使用C插座。是否可以通过在外部" C"内声明而不是包括&lt; sys/socket.h>?
来使用它们。我们可以使用extern" c"来声明libc绑定,例如写入:
extern "C" {
int write(int fd, const char *buf, int count);
};
但是,当声明所需的插座功能时,结果不可靠。我发现我可以创建插座并设置选项,但是Connect((始终限制。
这是使用纯出" C"声明
的示例gcc extern.cpp -o extern ; ./extern
extern "C" {
struct hostent {
char * h_name;
char ** h_aliases;
int h_addrtype;
int h_length;
char ** h_addr_list;
};
#define h_addr h_addr_list[0]
struct in_addr {
unsigned long s_addr;
};
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
struct sockaddr_in {
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
void* memset(void*, int, long unsigned int);
void* memcpy(void*, const void*, long unsigned int);
int write(int, const char*, int);
int close(int);
hostent* gethostbyname(const char*);
int socket(int, int, int);
int connect(int, sockaddr*, int);
int send(int, const char*, int, int);
int recv(int, char*, int, int);
int getsockopt(int, int, int, void*, unsigned int*);
int setsockopt(int, int, int, const void*, unsigned int);
unsigned short htons(unsigned short);
void perror(const char*);
void exit(int);
#define AF_INET 2
#define SOCK_STREAM 1
#define TCP_NODELAY 1
#define TCP_SYNCNT 7
#define IPPROTO_TCP 6
};
void error(const char *s) {
perror(s);
exit(1);
}
int main() {
hostent *hp;
int nodelay = 1;
int sockfd;
struct sockaddr_in serv_addr;
if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
error("socket");
}
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (const char *)&nodelay, sizeof(int));
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
if((hp = gethostbyname("stackoverflow.com")) == 0) {
error("gethostbyname");
}
memcpy(&serv_addr.sin_addr, hp->h_addr, hp->h_length);
// Reduce sock timeout
int synRetries = 2;
setsockopt(sockfd, IPPROTO_TCP, TCP_SYNCNT, &synRetries, sizeof(synRetries));
// When using extern "C" this seems to timeout
if (connect(sockfd, (sockaddr*)(&serv_addr), sizeof(struct sockaddr_in)) < 0) {
close(sockfd);
error("connect");
}
send(sockfd, "GET / HTTP/1.1rnrn ", 19, 0);
char buf[1024];
recv(sockfd, buf, 1024, 0);
write(0, buf, 1024);
close(sockfd);
return 0;
}
我希望Connect((函数能够解决;但是,除非我包括 <sys/socket.h>
connect((将超时。
是否有任何解决方案,我有兴趣查看是否有可能使用纯extern" c"使用插座。
您似乎已经从GethostbyName中获得了IPv6地址,并将其写给Sockaddr,溢出了缓冲区和垃圾的东西。然后,您尝试将IPv6地址的铅部分连接到IPv4地址,并且IP不想与您交谈。
这行很疯狂,但我看不出为什么会失败:
memset(&amp; serv_addr,'0',sizeof(serv_addr((
应该是
memset(&amp; serv_addr,0,sizeof(serv_addr((
相关文章:
- 在不知道套接字的情况下关闭网络连接
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 如何在没有套接字管理的情况下使用OpenSSL库?
- 我可以在不包含 <sys/socket.h> 的情况下使用 C 套接字吗?
- C++,在阻塞模式下从套接字读取所有可用字节的最佳方法
- 套接字:在没有memcpy的情况下,使用recvfrom将UDP数据获取到字对齐的缓冲区
- 在没有 SO_LINGER > 0 的情况下强制关闭服务器端套接字可能会丢失数据,对吧?
- 抽象库,便于在linux下进行套接字编程
- c++套接字客户端在输出流关闭的情况下不断从Java服务器事件中接收一些内容
- 如何处理在同一套接字上发布多个操作的情况
- 即使在文件描述符不可用的情况下,也能有效地侦听多个套接字
- 如何在不关闭服务器套接字的情况下在C++客户端的主循环中接收数据?
- 如何在不相互阻塞的情况下使用套接字和计时器
- Listen套接字只能在没有-std=c++的情况下在c++中工作
- 如何在winsock中不绑定套接字的情况下接收数据
- 在这种情况下,sendto()在UDP套接字上返回0
- 在不关闭本机处理程序的情况下销毁Boost Asio套接字
- 如何在连接了所有客户端套接字的情况下关闭boost asio服务器套接字
- 在有条件的情况下,连接到C++和Boost Asio中的套接字