【发布时间】:2014-04-13 22:29:12
【问题描述】:
在网上冲浪时,我发现了一个发送 GET 请求的 c++ 示例。我无法理解的这段代码部分是为什么(参见粗体部分)变量 addr 是类型转换的。我了解该功能仅接受某种类型。但是为什么要使用一种类型,然后再将其转换为另一种呢?
#include <iostream>
#include <sys/socket.h>
#include <resolv.h>
#include <arpa/inet.h>
using namespace std;
int main()
{
int s, error;
struct sockaddr_in addr;
if((s = socket(AF_INET,SOCK_STREAM,0))<0)
{
cout<<"Error 01: creating socket failed!\n";
close(s);
return 1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
inet_aton("204.27.61.92",&addr.sin_addr);
error = connect(s,(sockaddr*)&addr,sizeof(addr));
if(error!=0)
{
cout<<"Error 02: conecting to server failed!\n";
close(s);
return 1;
}
char msg[] = "GET /beej/inet_ntoaman.html http/1.1\nHOST: retran.com\n\n";
char answ[1024];
//cin.getline(&msg[0],256);
send(s,msg,sizeof(msg),0);
while(recv(s,answ,1024,0)!=0)
cout<<answ<<endl;
close(s);
cin.getline(&msg[0],1);
return 0;
}
【问题讨论】:
-
因为
connect()需要sockaddr类型作为参数。如此处所示,int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); -
我明白了,但是为什么要定义一个端口等然后更改结构以使其不再包含这些信息。我错过了什么吗?
-
您可能忽略了一个事实,即有多个套接字地址族,需要不同的信息,但都使用相同的函数组。
标签: c++ sockets network-programming