C 通过UDP传输文件内容后获取垃圾字符
使用UDP开发基于客户端/服务器的应用程序,以在远程服务器上执行程序。i、 e.客户端将可执行文件发送到服务器,服务器执行该文件,并将结果存储在 文件并发送回客户端 我已经编码了2个文件 //向服务器发送可执行文件名;服务器执行它 //回声程序;这是客户的代码C 通过UDP传输文件内容后获取垃圾字符,c,sockets,udp,output,file-transfer,C,Sockets,Udp,Output,File Transfer,使用UDP开发基于客户端/服务器的应用程序,以在远程服务器上执行程序。i、 e.客户端将可执行文件发送到服务器,服务器执行该文件,并将结果存储在 文件并发送回客户端 我已经编码了2个文件 //向服务器发送可执行文件名;服务器执行它 //回声程序;这是客户的代码 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include &l
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
void usage(const char *progname)
{
fprintf(stderr, "Usage: %s <server-IP> <server-port>\n",
progname);
}
int main(int argc, char *argv[])
{
if(argc != 3)
{
usage(argv[0]);
exit(1);
}
int len, result, sockfd,clilen;
int n;
struct sockaddr_in seraddr;
char buf[310], buf1[500]={0};
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd<0)
{ // Check error condition
perror("socket failed"); return -1;
}
bzero(&seraddr, sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_addr.s_addr = INADDR_ANY;
seraddr.sin_port=htons(atoi(argv[2]));
int ap;
clilen=sizeof(struct sockaddr_in);
//read contents of file into buf; send to server
int fd = open("Executable_Client.c", O_RDWR);
int n1 = read(fd, buf, sizeof(buf));
n = write(sockfd,buf,n1);
ap=sendto(sockfd,buf,n1,0,(const struct sockaddr
*)&seraddr, sizeof(struct sockaddr));
int n2 = recvfrom(sockfd, buf1, sizeof(buf1), 0, (struct
sockaddr *)&seraddr, &clilen);
n = read(sockfd,buf1, n2);
printf("The output is: %s\n", buf1);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效用法(常量字符*程序名)
{
fprintf(标准,“用法:%s\n”,
项目名称);
}
int main(int argc,char*argv[])
{
如果(argc!=3)
{
用法(argv[0]);
出口(1);
}
int len,result,sockfd,clilen;
int n;
seraddr中的结构sockaddr_;
char buf[310],buf1[500]={0};
sockfd=插座(AF_INET,SOCK_DGRAM,0);
如果(sockfd代码在不同的地方都是错误的。只需简单介绍一下最明显的一点:
您将recvfrom与read混合,并尝试读取相同的数据(与混合sendto和write之后的操作相同)
你打印出的缓冲区与你实际收到的数据量无关。这当然会打印出在读取之前缓冲区中的任何垃圾数据,并且这些数据不会被读取覆盖
printf("The output is: %s\n", buf1);
当然,只要你不关心数据包重新排序、数据包丢失和数据包复制,用UDP做这些事情是个坏主意。你不想使用UDP。这样做是错误的,甚至没有什么意思。使用TCP。我没有这个选项。如果你没有选择使用TCP,我无法改变这个问题你必须在你的代码中处理数据包重新排序、数据包丢失和数据包重复,而你没有。TCP为你做这件事,而UDP不是。我之前用这段代码得到了输出。我做了一些愚蠢的修改,然后我开始出现问题。这是一个非常小的文件,数据包重新排序真的必要吗?谢谢:)。我尝试了这么长时间。我注释掉了读取行,并更改了printf语句以匹配printf(“%s”,stringLength,pointerToString);
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a, b, c;
a = 3;
b = 4;
c = a+b;
printf("a+b = %d\n", c);
return 0;
}
int n2 = recvfrom(sockfd, buf1, sizeof(buf1), 0, (struct
sockaddr *)&seraddr, &clilen);
n = read(sockfd,buf1, n2);
printf("The output is: %s\n", buf1);