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