Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过UDP传输文件内容后获取垃圾字符_C_Sockets_Udp_Output_File Transfer - Fatal编程技术网

C 通过UDP传输文件内容后获取垃圾字符

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

使用UDP开发基于客户端/服务器的应用程序,以在远程服务器上执行程序。i、 e.客户端将可执行文件发送到服务器,服务器执行该文件,并将结果存储在 文件并发送回客户端

我已经编码了2个文件

//向服务器发送可执行文件名;服务器执行它 //回声程序;这是客户的代码

      #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);