C语言中的UDP文件传输

C语言中的UDP文件传输,c,sockets,udp,runtime-error,runtime,C,Sockets,Udp,Runtime Error,Runtime,我正在做一个套接字编程,用于在C中通过UDP实现文件传输。服务器和客户端代码都在执行时不报告任何错误:当我运行代码时,两个套接字都被创建和绑定,并且提示我在客户端输入文件名。但在我进入它之后,没有其他事情发生。双方都保持空白,而我应该在服务器端获得“文件名已接收”输出,然后提示输入加密密钥。我不明白,我也不知道为什么。我尝试了几次代码迭代,甚至在网上尝试了代码建议,但没有成功。有什么问题 这是服务器代码 #include <stdio.h> #include <stdlib.h

我正在做一个套接字编程,用于在C中通过UDP实现文件传输。服务器和客户端代码都在执行时不报告任何错误:当我运行代码时,两个套接字都被创建和绑定,并且提示我在客户端输入文件名。但在我进入它之后,没有其他事情发生。双方都保持空白,而我应该在服务器端获得“文件名已接收”输出,然后提示输入加密密钥。我不明白,我也不知道为什么。我尝试了几次代码迭代,甚至在网上尝试了代码建议,但没有成功。有什么问题

这是服务器代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

#define SA struct sockaddr
#define PORT 12345
#define SIZE 256
#define EMP "the file does not exist"

char encrypt(char c, char k){

    return c ^ k;
}

int sendfl(FILE *fp, char *buff, int l, char k){

    int i, len;

    if(fp == NULL){

        strcpy(buff, EMP);
        len = strlen(EMP);
        buff[l] = EOF;

        for(i = 0; i < len; i++)
            buff[i] = encrypt(buff[i], k);
            return 1;
    }

    char c1, c2;

    for(i = 0; i < l; i++) {
        c1 = fgetc(fp);
        c2 = encrypt(c1, k);
            buff[i] = c2;
    if(c1 == EOF)
        return 1;
    }

        return 0;

}

int main(){

    int sockid, len, e, n;
    char key;
    char flname[SIZE];
    char buff[SIZE];    
    FILE *fp;
    struct sockaddr_in servaddr;

    len = sizeof(servaddr);

    sockid = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockid < 0){
        perror("failed to create socket");
            exit(0);
    }
    printf("socket created! \n");

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    servaddr.sin_addr.s_addr = INADDR_ANY;

    e = bind(sockid, (SA*)&servaddr, len);
    if(e == -1){
        perror("failed to bind");
        exit(1);
    }
    printf("bind successful, \n");

    while (1) {

        printf("waiting for file name... \n");

        bzero(flname, SIZE);

        n = recvfrom(sockid, flname, sizeof(flname), 0, (SA*)&servaddr, &len);
        printf("file name recieved \t%s\n", flname);

        fp = fopen(flname, "r");
        if(fp == NULL){
            perror("failed to open file");
            exit(1);
        }
        printf("file opened...");

        printf("enter encryption key \t");
        scanf("%c\n", &key);

        while (1) {

            if(sendfl(fp, buff, SIZE, key)){
                sendto(sockid, buff, SIZE, 0, (SA*)&servaddr, len);
                break;
            }

             sendto(sockid, buff, SIZE, 0, (SA*)&servaddr, len);
             bzero(buff, SIZE);
        }

        if(fp != NULL)
        fclose(fp);
         }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义SA结构sockaddr
#定义端口12345
#定义大小256
#定义EMP“文件不存在”
字符加密(字符c、字符k){
返回c^k;
}
int sendfl(文件*fp,字符*buff,int l,字符k){
int i,len;
如果(fp==NULL){
strcpy(buff,EMP);
len=strlen(EMP);
buff[l]=EOF;
对于(i=0;i
这是客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

#define SA struct sockaddr
#define PORT 12345
#define IPA "127.0.0.1"
#define SIZE 256
#define EMP "the file does not exist"

char decrypt(char c, char k){

    return c ^ k;
}

int recfl(char *buff, int l, char k){

    int i;
    char c1, c2;

    for(i = 0; i < l; i++) {
        c1 = buff[i];
        c2 = decrypt(c1, k);
    if(c2 == EOF)
        return 1;
    else
        printf("%c", c2);
    }

        return 0;
}

int main(){

    int sockid, len, n;
    char key;
    char flname[SIZE];
    char buff[SIZE];    
    FILE *fp;
    struct sockaddr_in servaddr;

    len = sizeof(servaddr);

    sockid = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockid < 0){
        perror("failed to create socket");
            exit(0);
    }
    printf("\nsocket created!\n");

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    servaddr.sin_addr.s_addr = inet_addr(IPA);

    while (1) {

        bzero(flname, SIZE);

        printf("\nenter file name:\t");
        scanf("%s\n", flname);

        sendto(sockid, flname, sizeof(flname), 0, (SA*)&servaddr, len);
        printf("\nfile recieved\n");

        printf("\nenter encryption key\t");
        scanf("%c\n", &key);

        printf("\n--------------------DATA RECIEVED--------------------\n");

        while (1) {

             bzero(buff, SIZE);
             n = recvfrom(sockid, buff, SIZE, 0, (SA*)&servaddr, &len);

            if(recfl(buff, SIZE, key)){
                
                break;
            }

        }

        printf("\n-----------------------------------------------------\n");
        }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义SA结构sockaddr
#定义端口12345
#定义IPA“127.0.0.1”
#定义大小256
#定义EMP“文件不存在”
字符解密(字符c,字符k){
返回c^k;
}
int recfl(字符*buff,int l,字符k){
int i;
字符c1,c2;
对于(i=0;i
最重要的是,您忽略了
\n
scanf(“%s\n”,flname)
中的作用;以下是C标准的描述:

由空白字符组成的指令通过读取输入到 第一个非空白字符(保持未读状态),或直到无法读取更多字符 被阅读

因此,等待更多的输入是你感觉到的,因为没有其他事情发生


加上chux的建议,如果您删除
\n

尝试
scanf(“%c\n”,&key),您可以更进一步-->
scanf(“%c”和键)
ImTheShell,您认为scanf(“%c\n”,&key)怎么样是吗?老实说,我不知道它是干什么的,哈哈,我是说。。。没有空间,但是的,我会给它一个额外的空间拍摄。谢谢你的建议非常感谢你的帮助!这就是问题所在,在我删除了/n并调整了循环中scanf的位置后,程序运行得非常完美!再次感谢大家的帮助!