gpt4 book ai didi

c - 使用 SOCK_DGRAM 从服务器获取信息时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:05 24 4
gpt4 key购买 nike

我有以下程序(DGRAM 套接字)从时间服务器检索时间。该程序没有按预期打印出当前时间。

#define DAYTIME_SERVER_PORT  13

int main(int argc, char *argv[])
{

int connectionFd, in;
struct sockaddr_in servaddr;
char buf[BUFSIZ];

connectionFd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(DAYTIME_SERVER_PORT);
inet_pton(AF_INET,"time.mit.edu", &servaddr.sin_addr);

sendto( connectionFd,buf ,1, 0,(struct sockaddr_in *)&servaddr, sizeof(servaddr) );

in = recv(connectionFd, buf, BUFSIZ, 0 ) ;
buf[in] = 0 ;
printf("Time is %s \n",buf);

close(connectionFd);


}

我的问题是 - 我在哪里犯了错误?感谢任何代码更改和宝贵的建议。我不确定如何使用 recvform 函数,因此尝试了 recv。我连接的白天服务器是 time.mit.edu

最佳答案

inet_pton() 不会查找像 time.mit.edu 这样的主机名。它只是将字符串形式的 IP 地址,如 "18.7.21.144",转换为套接字地址。

您应该使用 getaddrinfo() 来查找像 "time.mit.edu" 这样的名称。它还可以完成查找 daytime 端口号的工作。您的代码如下所示:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int main(int argc, char *argv[])
{
struct addrinfo *addr;
struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM };
int err;
int connectionFd, in;
char buf[1024];

err = getaddrinfo("time.mit.edu", "daytime", &hints, &addr);
if (err) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err));
return 1;
}

connectionFd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);

sendto(connectionFd, "." , 1, 0, addr->ai_addr, addr->ai_addrlen );

freeaddrinfo(addr);

in = recv(connectionFd, buf, sizeof buf - 1, 0 ) ;
buf[in] = 0 ;
printf("Time is %s \n",buf);

close(connectionFd);
return 0;
}

(看,Ma:支持 IPv6 的白天;)

当然,你还应该检查socket()sendto()recv()的返回值,就像我为 getaddrinfo() 做了。特别是考虑如果 recv() 失败并返回 -1...

会发生什么

关于c - 使用 SOCK_DGRAM 从服务器获取信息时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4394412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com