我有一个connect()
类型的变量,我想在给定的ip中使用(struct sockaddr *)
。因此,我需要connect()
变量作为in_addr_t
的参数。如何插入使用in_addr_t var; // Given variable, not actually declared here ofc
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in *srvraddr = malloc(sizeof(struct sockaddr_in));
memset((void *) srvraddr, 0, sizeof(struct sockaddr_in));
srvraddr->sin_family = AF_INET;
srvraddr->sin_port = htons(PORT_A); // Big - little endian arch compatibility
srvraddr->sin_addr.s_addr = var; // Somehow assign var here? <<<<<
connect(sockfd, (struct sockaddr *) srvraddr, sizeof(struct sockaddr_in));
变量?
-1
无论我尝试做什么,连接总是返回perror
。
使用Connection refused
我收到以下错误:String uniqueString = Long.toString(id, 35);
uniqueString = uniqueString.replace('o', 'z');
uniqueString = uniqueString.toUpperCase();
。
答案 0 :(得分:2)
如何插入使用
in_addr_t
变量?
您不能将in_addr_t
与connect()
一起使用,而不是struct sockaddr_in
。 connect()
接受不同的地址结构类型,但不接受任意地址结构类型。 IPv4地址的正确结构类型是您已使用的struct sockaddr_in
。您需要在其中存储远程主机地址的适当表示。
显然,你已经有in_addr_t
断言代表远程地址,但不确定如何使用它:
in_addr_t var; // Given variable, not actually declared here ofc
[...]
srvraddr->sin_addr.s_addr = var; // Somehow assign var here? <<<<<
然而,您所呈现的内容正是POSIX所期望的。 POSIX要求sin_addr
的{{1}}成员是至少具有struct sockaddr_in
s_addr
类型成员的结构。假设您拥有的in_addr_t
实际上是您要连接的机器地址的正确表示,那么将该值分配给您的地址结构的in_addr_t
是正确的。原则上,该结构可能有更多成员,但在实践中,希望可互操作的实现不需要您设置任何其他成员。大多数人根本没有其他成员。
但请注意,仅仅因为sin_addr.s_addr
通过指针接收地址结构并不意味着您需要使用动态分配。这样做会更加惯用:
connect()
除此之外,还可以节省您之后释放内存的费用。
无论我尝试做什么,连接总是返回-1。使用perror我收到以下错误:连接被拒绝。
据我所知,您提供的代码很好。您可能想要检查首先获取int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in srvraddr = { 0 };
srvraddr.sin_family = AF_INET;
srvraddr.sin_port = htons(PORT_A);
srvraddr.sin_addr.s_addr = var;
connect(sockfd, (struct sockaddr *) &srvraddr, sizeof(srvraddr));
值的方式,并验证您使用的端口号。另一方面,不要忽视问题出在远程主机的可能性:您尝试连接的端口可能不是打开的(对您而言)。
答案 1 :(得分:-1)
这是我使用connect()在端口80上获得与“example.com”的连接的方法:
#include <stdio.h>
#include <netdb.h>
#include <unistd.h>
int main(void)
{
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
fprintf(stderr, "socket");
return 0;
}
char domain[] = "example.com";
struct hostent *he;
he = gethostbyname (domain);
if (!he)
{
switch (h_errno)
{
case HOST_NOT_FOUND:
fputs ("The host was not found.\n", stderr);
break;
case NO_ADDRESS:
fputs ("The name is valid but it has no address.\n", stderr);
break;
case NO_RECOVERY:
fputs ("A non-recoverable name server error occurred.\n", stderr);
break;
case TRY_AGAIN:
fputs ("The name server is temporarily unavailable.", stderr);
break;
}
return 1;
}
if (he->h_length < 4)
return 1;
struct sockaddr_in srvraddr;
srvraddr.sin_len = sizeof(srvraddr);
srvraddr.sin_family = AF_INET;
srvraddr.sin_port = htons(80);
srvraddr.sin_addr = * (struct in_addr *) he->h_addr_list[0];
if (connect(sockfd, (struct sockaddr*)&srvraddr, srvraddr.sin_len) == -1) {
fprintf(stderr,"connect() failed\n");
return 1;
}
// Use conection here...
close(sockfd);
return 0;
}