1

我正在开发一个项目,该项目涉及通过 UDP 向服务器发送各种请求。但是,我似乎完全错误地设置了套接字,因为服务器没有响应我的任何请求。我们提供了一个服务器二进制文件进行测试,下面的代码没有引起任何响应。我是否正确设置了 UDP 套接字?如果是这样,我是否以某种方式使用 sendto 错误?我已确认我发送的位数正确。

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

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

代码:

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

// Prepare the socket address
memset(&sa, 0, sizeof sa);
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr(argv[1]);
// Convert to network order
sa.sin_port = htonl(atoi(argv[2]));

// Assemble and send login request
struct request_login * reqlogin = (struct request_login *) malloc(sizeof(struct request_login));
reqlogin->req_type = REQ_LOGIN;
strcpy(reqlogin->req_username, argv[3]);

int res = sendto(sockfd, reqlogin, sizeof (struct request_login), 0, (struct sockaddr*)&sa, sizeof sa);
free(reqlogin)
4

3 回答 3

3

嗯?

这:

sa.sin_addr.s_addr = inet_addr(argv[1]);

如果如您所说,argv[1]通常是"localhost". 您需要查找主机名,以便获得 IP 地址。您只能inet_addr()在输入是点 IP 地址而不是主机名时使用。

getaddrinfo()

于 2012-10-24T07:48:41.977 回答
2

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

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

端口号是 ashort所以你应该使用它htons。它非常小,很容易错过。

于 2012-10-24T07:49:20.997 回答
1

试试这个:

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);
于 2012-10-24T10:03:05.653 回答