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