C中的UDP套接字-设置错误?

C中的UDP套接字-设置错误?,c,sockets,udp,C,Sockets,Udp,我正在从事一个项目,该项目涉及通过UDP向服务器发送各种请求。然而,我似乎完全错误地设置了套接字,因为服务器没有响应我的任何请求。我们得到了一个要测试的服务器二进制文件,下面的代码没有响应。我是否正确设置UDP套接字?如果是这样,我是不是用sendto搞错了?我已确认发送的位数正确 程序的输入是:./client[URL][port][username],我总是使用。/client localhost 8080 user进行测试。这是我要发送的结构和代码 struct request_login

我正在从事一个项目,该项目涉及通过UDP向服务器发送各种请求。然而,我似乎完全错误地设置了套接字,因为服务器没有响应我的任何请求。我们得到了一个要测试的服务器二进制文件,下面的代码没有响应。我是否正确设置UDP套接字?如果是这样,我是不是用sendto搞错了?我已确认发送的位数正确

程序的输入是:./client[URL][port][username],我总是使用。/client localhost 8080 user进行测试。这是我要发送的结构和代码

struct request_login {
    int req_type; /* = REQ_LOGIN */
    char req_username[32];
} packed;
代码:

这:

如果如您所说,argv[1]通常是localhost,那么肯定不会做正确的事情。您需要查找主机名,以便获得IP地址。如果输入是虚线IP地址,而不是主机名,则只能使用inet_addr

看看。

这:

如果如您所说,argv[1]通常是localhost,那么肯定不会做正确的事情。您需要查找主机名,以便获得IP地址。如果输入是虚线IP地址,而不是主机名,则只能使用inet_addr


请看。

在重新阅读您的代码几次之后,我想我知道错误的原因可能是:

sa.sin_port = htonl(atoi(argv[2]));

端口号较短,因此应改用HTON。它非常小,很容易丢失。

在重新阅读了几次代码后,我想我知道了错误的原因:

sa.sin_port = htonl(atoi(argv[2]));
端口号较短,因此应改用HTON。它很小,很容易丢失。

试试这个:

struct addrinfo hint;
memset(&chk,0,sizeof(chk));
hint.ai_family = AF_INET;
hint.ai_socktype = SOCK_DGRAM;
hint.ai_protocol = IPPROTO_UDP;

struct addrinfo* servAddr = NULL;
int ret = getaddrinfo(argv[1],atoi(argv[2]),&hint,&servAddr);
if (-1 == ret)
{
  perror("getaddrinfo failed");
  exit(EXIT_FAILURE);
}

int sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd == -1){
   printf("Could not create socket.");
   exit(EXIT_FAILURE);
}

// Assemble and send login request
struct request_login reqlogin;
reqlogin.req_type = REQ_LOGIN;
strcpy(reqlogin.req_username, argv[3]);

int res = sendto(sockfd, &reqlogin, sizeof (struct request_login), 0, servAddr->ai_addr, servAddr->ai_addrlen);
请尝试以下方法:

struct addrinfo hint;
memset(&chk,0,sizeof(chk));
hint.ai_family = AF_INET;
hint.ai_socktype = SOCK_DGRAM;
hint.ai_protocol = IPPROTO_UDP;

struct addrinfo* servAddr = NULL;
int ret = getaddrinfo(argv[1],atoi(argv[2]),&hint,&servAddr);
if (-1 == ret)
{
  perror("getaddrinfo failed");
  exit(EXIT_FAILURE);
}

int sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd == -1){
   printf("Could not create socket.");
   exit(EXIT_FAILURE);
}

// Assemble and send login request
struct request_login reqlogin;
reqlogin.req_type = REQ_LOGIN;
strcpy(reqlogin.req_username, argv[3]);

int res = sendto(sockfd, &reqlogin, sizeof (struct request_login), 0, servAddr->ai_addr, servAddr->ai_addrlen);

sendto的返回值是多少?request_登录结构是什么样子的?关于sendto的返回值,如果是负数,则打印出的值,或用于获取可打印的错误代码字符串。感谢您的回复。sendto返回36,这是结构的正确位数。我编辑了上面的文章来显示struct.bytes,你的意思是。。。不是bits:sendto的返回值是多少?request_登录结构是什么样子的?关于sendto的返回值,如果是负数,则打印出的值,或用于获取可打印的错误代码字符串。感谢您的回复。sendto返回36,这是结构的正确位数。我编辑了上面的文章来显示struct.bytes,你的意思是。。。不是bits:使用getaddrinfo可能比使用某种程度上被贬低的gethostbyname更好。@alk谢谢,已编辑!显然,我很久没有做任何套接字编程了使用getaddrinfo可能比使用某种程度上被贬低的gethostbyname更好。@alk谢谢,已编辑!显然,我很久没有做任何套接字编程了