我的 UDP 客户端服务器出了什么问题?
我有一个 UDP 服务器,它应该等待客户端连接到它,并向其发送一个文件名字符串。现在我只想它将文件名回显给客户端。这是我的代码
服务器
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MAXBUFLEN 1024
// Usage: ./server PORT
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in server;
size_t clientSize;
struct sockaddr_storage client;
char buf[MAXBUFLEN];
int portno = atoi(argv[1]);
int numbytes;
printf("Port: %d\n", portno);
// Create UDP Socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("Can't create socket");
exit(-1);
}
// Configure socket
memset(&server, 0, sizeof server);
server.sin_family = AF_INET; // Use IPv4
server.sin_addr.s_addr = INADDR_ANY; // My IP
server.sin_port = htons(portno); // Server Port
// Bind socket
if ((bind(sockfd, (struct sockaddr *) &server, sizeof(server))) == -1) {
close(sockfd);
perror("Can't bind");
}
while (1) {
printf("Waiting for data...\n");
// Receive data from Client
clientSize = sizeof(client);
numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1,0,
(struct sockaddr *) &client, &clientSize);
buf[numbytes] = '\0';
printf("client sent: %s\n", buf);
// Rely to client
sendto(sockfd, buf, MAXBUFLEN-1, 0,
(struct sockaddr *) &client, &clientSize);
}
printf("Closing");
close(sockfd);
return 0;
}
客户端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MAXBUFLEN 1024
//Usage: ./client PORT IP FILE
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in server;
// struct sockaddr_storage client;
char buf[MAXBUFLEN];
int portno = atoi(argv[1]);
char *serverIP = argv[2];
char *filename = argv[3];
int numbytes;
printf("Port: %d, IP:%s, File:%s\n", portno, serverIP, filename);
// Create UDP Socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("Can't create socket");
exit(-1);
}
// The server IP and Port
memset(&server, 0, sizeof server);
server.sin_family = AF_INET; // Use IPv4
server.sin_port = htons(portno); // Server Port
struct hostent *hp = gethostbyname(serverIP);
memcpy((char*)&server.sin_addr, (char*)hp->h_name, hp->h_length);
printf("Sent %s\n", filename);
// No need to bind, just send request for file
int serverSize = sizeof(server);
sendto(sockfd, argv[3], strlen(argv[3]), 0,
(struct sockaddr *) &server, serverSize);
printf("Waiting for reply\n");
recvfrom(sockfd, buf, MAXBUFLEN-1, 0,
(struct sockaddr *) &server, serverSize);
buf[numbytes] = '\0';
printf("server sent: %s\n", buf);
close(sockfd);
}
到目前为止,服务器只打印
Waiting for data...
一次......所以它永远不会收到请求。
客户端打印出:
./client 8083 127.0.0.1 hello
Port: 8083, IP:127.0.0.1, File:hello
Sent hello
Waiting for reply
server sent:
请帮忙,我是 C 和 UDP 套接字世界的新手。
哦,是的,我已经阅读了 Beej 的指南...请不要只是将其作为答案发布。
I have a UDP Server that should sit and wait for a client to connect to it, and send it a string of a filename. Right now I just want it to echo back the filename to the client. Here is my code
Server
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MAXBUFLEN 1024
// Usage: ./server PORT
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in server;
size_t clientSize;
struct sockaddr_storage client;
char buf[MAXBUFLEN];
int portno = atoi(argv[1]);
int numbytes;
printf("Port: %d\n", portno);
// Create UDP Socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("Can't create socket");
exit(-1);
}
// Configure socket
memset(&server, 0, sizeof server);
server.sin_family = AF_INET; // Use IPv4
server.sin_addr.s_addr = INADDR_ANY; // My IP
server.sin_port = htons(portno); // Server Port
// Bind socket
if ((bind(sockfd, (struct sockaddr *) &server, sizeof(server))) == -1) {
close(sockfd);
perror("Can't bind");
}
while (1) {
printf("Waiting for data...\n");
// Receive data from Client
clientSize = sizeof(client);
numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1,0,
(struct sockaddr *) &client, &clientSize);
buf[numbytes] = '\0';
printf("client sent: %s\n", buf);
// Rely to client
sendto(sockfd, buf, MAXBUFLEN-1, 0,
(struct sockaddr *) &client, &clientSize);
}
printf("Closing");
close(sockfd);
return 0;
}
Client
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MAXBUFLEN 1024
//Usage: ./client PORT IP FILE
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in server;
// struct sockaddr_storage client;
char buf[MAXBUFLEN];
int portno = atoi(argv[1]);
char *serverIP = argv[2];
char *filename = argv[3];
int numbytes;
printf("Port: %d, IP:%s, File:%s\n", portno, serverIP, filename);
// Create UDP Socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("Can't create socket");
exit(-1);
}
// The server IP and Port
memset(&server, 0, sizeof server);
server.sin_family = AF_INET; // Use IPv4
server.sin_port = htons(portno); // Server Port
struct hostent *hp = gethostbyname(serverIP);
memcpy((char*)&server.sin_addr, (char*)hp->h_name, hp->h_length);
printf("Sent %s\n", filename);
// No need to bind, just send request for file
int serverSize = sizeof(server);
sendto(sockfd, argv[3], strlen(argv[3]), 0,
(struct sockaddr *) &server, serverSize);
printf("Waiting for reply\n");
recvfrom(sockfd, buf, MAXBUFLEN-1, 0,
(struct sockaddr *) &server, serverSize);
buf[numbytes] = '\0';
printf("server sent: %s\n", buf);
close(sockfd);
}
So far the Server just prints out
Waiting for data...
only once... so its never getting a request.
and the Client prints out:
./client 8083 127.0.0.1 hello
Port: 8083, IP:127.0.0.1, File:hello
Sent hello
Waiting for reply
server sent:
Please help, I'm new to the world of C and UDP Sockets.
Oh yeah, and I already read Beej's Guide... please don't just post that as an answer.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
首先,您的服务器对 sendto 的调用存在错误。 clientSize 应该是一个值,而不是一个指针。另外,正如 Tom 所说,numbytes 应该设置为 recvfrom 的结果。
大问题可能是您将 hp->h_name 复制到服务器的 sin_addr 元素中。 h_name 是主机的名称,而不是 IP 地址。尝试在您的客户端中替换
为
。
In the first place, there is a bug in the call to sendto of your server. clientSize should be a value, not a pointer. Also, as Tom said, numbytes should be set to the result of recvfrom.
The big problem is likely that you are copying hp->h_name into the sin_addr element of the server. h_name is the name of the host, not the IP address. Try replacing
with
in your client.
您客户端中的 numbytes 未初始化也未使用!再次检查您的代码...
希望这有帮助,
此致,
汤姆.
numbytes in your client is not initialised nor is it used! Check again in your code....
Hope this helps,
Best regards,
Tom.
修复了错误!谢谢汤米。这就是我现在正在运行的。
服务器:
客户端:
我还在这里找到了一个很好的例子: http://www.linuxhowtos.org/ C_C++/socket.htm
感谢大家的帮助!
Fixed the bug! Thank You Tommy. Here is what I am running right now.
Server:
Client:
I also found a great example here: http://www.linuxhowtos.org/C_C++/socket.htm
Thanks for everyone's help!
愚蠢的问题,但你的防火墙是否阻止了端口 8083。
鲍勃。
Silly question, but is your firewall blocking port 8083.
Bob.