【发布时间】:2018-10-26 03:49:12
【问题描述】:
我有以下简单的 UDP 服务器客户端。当客户端向服务器发送某些内容时,它工作正常,但我无法让服务器将回复发送回客户端。我不确定问题是服务器回复还是客户端读取或两者兼而有之。我已经评论了服务器的回复/客户端读取的位置。
客户
#define PORT 8080
#define MAXLINE 1024
// Driver code
int main() {
int sockfd;
char buffer[MAXLINE];
char *hello = "Hello from client";
struct sockaddr_in servaddr;
// Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
// Filling server information
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
//servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_addr.s_addr = inet_addr("192.168.0.111"); //server address to send message to
int n, len;
sendto(sockfd, (const char *)hello, strlen(hello),
MSG_CONFIRM, (const struct sockaddr *) &servaddr,
sizeof(servaddr));
printf("Hello message sent.\n");
//**NOT READING THE REPLY FROM SERVER HERE**
n = recvfrom(sockfd, (char *)buffer, MAXLINE,
MSG_WAITALL, (struct sockaddr *) &servaddr,
&len);
buffer[n] = '\0';
printf("Server : %s\n", buffer);
close(sockfd);
return 0;
}
服务器
#define PORT 8080
#define MAXLINE 1024
// Driver code
int main() {
int sockfd;
char buffer[MAXLINE];
char *hello = "Hello from server";
struct sockaddr_in servaddr, cliaddr;
// Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
// Filling server information
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_addr.s_addr = INADDR_ANY; //ip of all local interfaces i.e. ip of wlan, ethernet etc
servaddr.sin_port = htons(PORT);
// Bind the socket with the server address
if ( bind(sockfd, (const struct sockaddr *)&servaddr,
sizeof(servaddr)) < 0 )
{
perror("bind failed");
exit(EXIT_FAILURE);
}
int len, n;
n = recvfrom(sockfd, (char *)buffer, MAXLINE,
MSG_WAITALL, ( struct sockaddr *) &cliaddr,
&len);
buffer[n] = '\0';
printf("Client : %s\n", buffer);
//**Client not receiving this message****
sendto(sockfd, (const char *)hello, strlen(hello),
MSG_CONFIRM, (const struct sockaddr *) &cliaddr,
len);
printf("Hello message sent.\n");
return 0;
}
【问题讨论】:
-
这不是你的全部代码。
-
您是否使用这些端口测试过已知的工作程序(例如
nc)?首先排除计算机上的防火墙/路由问题是个好主意。然后,您可以使用它们来测试程序的各个部分(例如,仅客户端或服务器)。您还应该检查sendto和recvfrom的返回值,以防发生错误。 -
您的代码(经过一些清理)对我有用。你的机器上的 8080 端口是空闲的吗? IP地址正常吗?我将其更改为
127.0.0.1。另一个问题是客户端n = recvfrom(),然后是buffer[n] = '\0'-recvfrom()函数在出错时返回-1。 -
如果端口或 ip 不起作用,那么从客户端到服务器的发送是否也不起作用?现在客户端->服务器每次都可以工作,但服务器返回客户端不起作用。