UDP客户端/服务器c
我一直在到处寻找答案。我对C语言的编码还不熟悉,如果我的教授允许我们选择C语言,我会喜欢的,但我离题了。我在本地运行OracleV-Box,运行Ubuntu客户端和Ubuntu服务器。我在服务器和客户端上编译了下面的代码,并给出了一些警告。我在服务器上运行代码(看起来不错),然后在客户机上运行。客户端要求发送一个PDF文件,就像我在TCP套接字传输中所做的那样(这非常有效)。我还在客户机和服务器上运行Wireshark,看起来请求是从客户机发出的,但服务器什么也不做,只是两端都坐着,没有把文件拉过来。不确定是代码还是别的什么UDP客户端/服务器c,c,sockets,udp,wireshark,C,Sockets,Udp,Wireshark,我一直在到处寻找答案。我对C语言的编码还不熟悉,如果我的教授允许我们选择C语言,我会喜欢的,但我离题了。我在本地运行OracleV-Box,运行Ubuntu客户端和Ubuntu服务器。我在服务器和客户端上编译了下面的代码,并给出了一些警告。我在服务器上运行代码(看起来不错),然后在客户机上运行。客户端要求发送一个PDF文件,就像我在TCP套接字传输中所做的那样(这非常有效)。我还在客户机和服务器上运行Wireshark,看起来请求是从客户机发出的,但服务器什么也不做,只是两端都坐着,没有把文件拉
/* Echo server using UDP */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVER_UDP_PORT 2466
#define MAXLEN 4096
int main(int argc, char **argv)
{
int sd, client_len, port, n;
char buf[MAXLEN];
struct sockaddr_in server, client;
switch(argc) {
case 1:
port = SERVER_UDP_PORT;
break;
case 2:
port = atoi(argv[1]);
break;
default:
fprintf(stderr, "Usage: %s [port]\n", argv[0]);
exit(1);
}
/* Create a datagram socket */
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
fprintf(stderr, "Can't create a socket\n");
exit(1);
}
/* Bind an address to the socket */
bzero((char *)&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sd, (struct sockaddr *)&server,
sizeof(server)) == -1) {
fprintf(stderr, "Can't bind name to socket\n");
exit(1);
}
while (1) {
client_len = sizeof(client);
if ((n = recvfrom(sd, buf, MAXLEN, 0,
(struct sockaddr *)&client, &client_len)) < 0) {
fprintf(stderr, "Can't receive datagram\n");
exit(1);
}
if (sendto(sd, buf, n, 0,
(struct sockaddr *)&client, client_len) != n) {
fprintf(stderr, "Can't send datagram\n");
exit(1);
}
}
close(sd);
return(0);
}
坐在那里等着客户
编译后,在客户端上运行代码:
./udp_client -s 1500 10.0.2.11 2466 > test.pdf
我运行的是(./udp\u客户端-s数据速率服务器\u IP服务器\u端口>(输出到客户端桌面上的文件))
这只会生成一个空白页。它应该有几页文字和图片
我还在Wireshark上收到客户端发送的消息,但服务器没有回复。
这就是我从终端运行STRACE时得到的结果
我想您只是忘记了在客户端打印接收到的数据:
if (strncmp(sbuf, rbuf, data_size) != 0)
printf("Data is corrupted\n");
close(sd);
printf(rbuf); // <----
return(0);
if(strncmp(sbuf、rbuf、数据大小)!=0)
printf(“数据已损坏\n”);
关闭(sd);
printf(rbuf);// 我想您只是忘记了在客户端打印接收到的数据:
if (strncmp(sbuf, rbuf, data_size) != 0)
printf("Data is corrupted\n");
close(sd);
printf(rbuf); // <----
return(0);
if(strncmp(sbuf、rbuf、数据大小)!=0)
printf(“数据已损坏\n”);
关闭(sd);
printf(rbuf);//在策略下运行服务器。这将产生大量的狼吞虎咽。等到它在你的终点站停止喷出。然后,在不点击control-C的情况下,复制并通过未编辑的gobbledygook的最后十到十五行,进入问题。然后运行发送客户端。如果这导致服务器运行的终端窗口中出现更多内容,请将其复制并粘贴到问题中,同样,未经编辑。您是否尝试在调试器下运行服务器,要查看它是否正在接收数据包,请在服务器上运行Wireshark,查看它是否正在接收数据包。服务器端的Wireshark看到的内容与客户端看到的完全相同。注意:我可以ping双方,并且双方都可以从对方ping中获取ICMP。请在strace
下运行服务器。这将产生大量的狼吞虎咽。等到它在你的终点站停止喷出。然后,在不点击control-C的情况下,复制并通过未编辑的gobbledygook的最后十到十五行,进入问题。然后运行发送客户端。如果这导致服务器运行的终端窗口中出现更多内容,请将其复制并粘贴到问题中,同样,未经编辑。您是否尝试在调试器下运行服务器,要查看它是否正在接收数据包,请在服务器上运行Wireshark,查看它是否正在接收数据包。服务器端的Wireshark看到的内容与客户端看到的完全相同。注意:我可以ping双方,并且双方都可以从对方的ping中获取ICMP。@MartinJames:我在本地测试了代码,它产生了预期的结果。尝试运行更改…没有成功。@MathiasKroll:在同一台计算机上运行客户机和服务器有效吗?我确实在同一台计算机上运行了客户机和服务器,它给了我“abcdefg…等等”大约10行,这是新的。这就是你得到的吗?如果有人能找出两个独立的客户机/服务器实例,而不是将它们保留在同一个系统上,那就太酷了。。但不管怎样……感谢blender和其他人(马蒂……不得不加上他平时的两分钱……价值这么多)@MartinJames:我在本地测试了代码,它产生了预期的结果。尝试在更改的情况下运行……没有成功。@MathiasKroll:在同一台计算机上运行客户机和服务器有效吗?我在同一台计算机上运行了客户机和服务器,它给了我大约10行新的“abcdefg…等”。这就是你得到的吗?如果有人能找出两个独立的客户机/服务器实例,而不是将它们保留在同一个系统上,那就太酷了。。但不管怎样……感谢blender和其他人(马蒂……不得不加上他平时的两分钱……价值这么多)
if (strncmp(sbuf, rbuf, data_size) != 0)
printf("Data is corrupted\n");
close(sd);
printf(rbuf); // <----
return(0);