当前位置: 首页 > 知识库问答 >
问题:

套接字编程,将sockaddr_in转换为sockaddr。为什么?

益锦程
2023-03-14
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define PORT 8080
int main ( int argument, char const *argv[] )
{
int obj_socket = 0, reader;
struct sockaddr_in serv_addr;
char *message = "A message from Client !";
char buffer[1024] = {0};
if (( obj_socket = socket (AF_INET, SOCK_STREAM, 0 )) < 0)
{
printf ( "Socket creation error !" );
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if(inet_pton ( AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0)
{
printf ( "\nInvalid address ! This IP Address is not supported !\n" );
return -1;
}
if ( connect( obj_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr )) < 0) // <--- QUESTION ABOUT THIS LINE
{
Printf ( "Connection Failed : Can't establish a connection over this socket !" );
return -1;
}
send ( obj_socket , message , strlen(message) , 0 );
printf ( "\nClient : Message has been sent !\n" );
reader = read ( obj_socket, buffer, 1024 );
printf ( "%s\n",buffer );
return 0;
}

我一直在阅读文档并遍历头文件以理解结构,然而,还有最后一件事我无法获得。

头定义sockaddr结构,该结构至少包括以下成员:sa_family_t、sa_family address family char、SA_Data[]套接字地址(可变长度数据)

标头应定义sockaddr_in结构,该结构应至少包括以下成员:sa_family_t sin_family AF_INET。in_port_t sin_port端口号。结构in_addr sin_addr IP地址。

if ( connect( obj_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr )) < 0)

共有1个答案

司徒阳曜
2023-03-14

这里的这个铸造的目的是什么,它把sockaddr_in铸造成sockaddr。

sockaddr_in未被种姓为sockaddrsockaddr_in*被种姓为sockaddr*

执行强制转换是因为正在调用的函数connect不接受sockaddr_in*参数,而是接受sockaddr*参数。

 类似资料:
  • 问题内容: 的绑定()函数接受一个指针,但在我看到所有的实施例中,结构来代替,并且被转换为: 我无法确定为什么要使用结构。为什么不只是准备并通过? 这只是约定吗? 问题答案: 不,不只是惯例。 是用于任何类型的套接字操作的通用描述符,而是特定于基于IP的通信的结构(IIRC,“ in”代表“ InterNet”)。据我所知,这是一种“多态性”:该函数假装采用,但是实际上,它将假定传入了适当的结构类

  • 问题内容: 我正在尝试快速进行简单的DNS查找。到目前为止,这是我拥有的代码: 此时,“地址” NSArray中的每个元素都是一个CFDataRef对象,该对象包装了一个sockaddr结构。 由于CFDataRef可以免费连接到NSData,因此可以像这样循环遍历它们: 到目前为止,一切都很好(我认为)。当我在单元测试中运行时,这会打印出有效的外观数据。这是我被卡住的地方。为了我的一生,我不知道

  • 我用Javax发送邮件有问题。我们使用gmail大约4年了,用我们的Java软件发送邮件。现在我得到了以下错误: 以下是我的gmail设置: 我还尝试了其他邮件服务器(O365、Strato),但收到了相同的错误。

  • 我正在尝试通过Gmail SMTP服务器使用JavaMail发送电子邮件。代码如下: 返回此错误: 无法将套接字转换为TLS; 完整的堆栈跟踪: 异常线程"main"javax.mail.RuntimeException:ervice.connectMessagingException:无法将套接字转换为TLS;嵌套异常是:ervice.java:176SSLHandshakeException:

  • 我收到了错误:org.springframework.mail。MailSendException:邮件服务器连接失败;嵌套的异常是javax.mail。MessaginException:无法将套接字转换为TLS;嵌套的异常是:javax.net.ssl。SSLHandshakeException:没有合适的协议(协议被禁用或密码套件不合适)。失败的消息:javax.mail。MessaginE

  • 我有一个UDP服务器,它必须同时为IPV4和IPV6地址上的客户端提供服务。我创建了一个IPV6套接字来同时为IPV4和IPV6客户端服务。 服务器在第一次通信时存储客户端的IPAddress。如果是IPV4客户端,则存储为IPV4地址;如果是IPV6客户端,则服务器存储为IPV6地址。对于以后的所有通信,它检查存储是否已知(存储)该客户端,然后相应地执行操作。为了将客户端地址与存储的地址进行比较