-
请教linux上的一个C传送文件的错误10
本人C新手,在linux上面试写了一个文件传送的客户端跟服务器.客户端跟服务器建立连接后,客户发送文件,服务端接收文件.在服务器接收文件fwrite的时候出现了一个段错误,请各位指教.
服务端代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/resource.h> #include <sys/epoll.h> #include "msghead.h" #define MAXBUF 1024 #define MAXEPOLLSIZE 10000 #define RECEIVE_FILE "/home/jason/c++/me1.jpg" int setnonblock(int sockfd){ int t; t=fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFD,0)|O_NONBLOCK); if(t<0){ perror("fcntl()"); return -1; }else{ return 0; } } int receiveFile(int sockfd){ char buf[MAXBUF]; bzero(buf,MAXBUF); FILE * stream; if(fopen(RECEIVE_FILE,"w+t")==NULL){ perror("fopen()"); exit(1); } int len,totallen=0; while(len=recv(sockfd,buf,MAXBUF,0)){ if(len<0){ printf("receive file faile\n"); break; } printf("len=%d\n",len); int write_len=fwrite(buf,sizeof(char),len,stream); if(write_len<len){ printf("file write faile\n"); break; } totallen=totallen+write_len; bzero(buf,MAXBUF); } printf("receive file finish!\n"); fclose(stream); return totallen; } int handleMsg(int sockfd){ int filelen=receiveFile(sockfd); printf("filelen=%d\n"); } int main(){ int sockfd,newfd,handlefd; struct sockaddr_in my_addr,des_addr; int port=1984,lisnum; int epollfd,wait_num; struct rlimit r; struct epoll_event e; struct epoll_event events[MAXEPOLLSIZE]; //set rlimit. r.rlim_cur=r.rlim_max=MAXEPOLLSIZE; if(setrlimit(RLIMIT_NOFILE,&r)<0){ perror("setrlimit()"); exit(1); }else{ printf("setrlimit have done!\n"); } //socket. sockfd=socket(PF_INET,SOCK_STREAM,0); if(sockfd<0){ perror("socket()"); exit(1); }else{ printf("socket have done!\n"); } setnonblock(sockfd); //bind. bzero(&my_addr,sizeof(my_addr)); my_addr.sin_family=PF_INET; my_addr.sin_port=htons(port); my_addr.sin_addr.s_addr=INADDR_ANY; if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))<0){ perror("bind()"); exit(1); }else{ printf("bind have done!\n"); } //listen. if(listen(sockfd,lisnum)<0){ perror("listen()"); exit(1); }else printf("listen have done!\n"); //epoll_create. epollfd=epoll_create(MAXEPOLLSIZE); e.events=EPOLLIN|EPOLLET; e.data.fd=sockfd; //epoll_ctl. if(epoll_ctl(epollfd,EPOLL_CTL_ADD,sockfd,&e)<0){ perror("epoll_ctl()"); exit(1); }else printf("epoll_ctl have done!\n"); int cur=1; while(1){ wait_num=epoll_wait(epollfd,events,cur,-1); if(wait_num<0){ perror("epoll_wait()"); exit(1); }else printf("epoll_wait have done!\n"); int i=0; for(i;i<wait_num;++i){ if(events[i].data.fd==sockfd){ int len=sizeof(struct sockaddr); newfd=accept(sockfd,(struct sockaddr*)&des_addr,&len); if(newfd<0){ perror("accept()"); printf("aaaa\n"); continue; }else printf("have a connection from ip:%s\n",inet_ntoa(des_addr.sin_addr)); printf("bbbb\n"); setnonblock(newfd); e.events=EPOLLIN|EPOLLET; e.data.fd=newfd; if(epoll_ctl(epollfd,EPOLL_CTL_ADD,newfd,&e)<0){ perror("newfd epoll_ctl()"); exit(1); } cur++; }else{ handlefd=handleMsg(events[i].data.fd); if(handlefd<1&&errno!=11){ epoll_ctl(epollfd,EPOLL_CTL_DEL,events[i].data.fd,&e); cur--; } } } } close(sockfd); }
客户端代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #include <arpa/inet.h> #define MAXBUF 1024 struct msgpak{ char msg_from[6]; char msg_to[7]; int msg_len; }; int main(){ int sockfd; struct sockaddr_in their_addr; char buf[MAXBUF+1]; int desport=1984; char * desip="127.0.0.1"; char * sendFile="/home/jason/c++/me.jpg"; //socket(). if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ perror("socket!"); exit(1); }else printf("socketed!"); //connect(). bzero(&their_addr,sizeof(their_addr)); their_addr.sin_family=AF_INET; their_addr.sin_port=htons(desport); if(inet_aton(desip,(struct in_addr *)&their_addr.sin_addr.s_addr)==0){ perror(desip); exit(1); } if(connect(sockfd,(struct sockaddr*)&their_addr,sizeof(struct sockaddr))!=0){ perror("connect"); exit(1); } //recv(). //bzero(&buf,MAXBUF+1); //int len=recv(sockfd,buf,MAXBUF,0); //if(len>0){ //printf("receive msg:%s\n",buf); //}else{ //printf("receive msg error!\n"); //} //send(). FILE * stream; if((stream=fopen(sendFile,"r"))==NULL){ perror("fopen()"); exit(1); }else printf("the file:%s is opened!\n",sendFile); bzero(buf,MAXBUF); int longsize=0; while((longsize=fread(buf,1,1024,stream))>0){ printf("longsize=%d\n",longsize); if(send(sockfd,buf,longsize,0)<0){ printf("send file is faile:\n"); break; } bzero(buf,MAXBUF); } if(fclose(stream)){ printf("the file %s was not close\n",sendFile); exit(1); } close(sockfd); return 0; }
2009年6月22日 16:20
目前还没有答案
相关推荐
本项目是关于在Linux环境下利用Qt框架构建一个简单的广告机应用。广告机的主要功能是展示HTML格式的广告内容,并可能通过CGI(Common Gateway Interface)程序与服务器进行交互,实现动态更新或者定制化服务。以下是...
* Makefile 文件:Makefile 文件是 Linux 内核构建系统的另一个核心文件。它提供了一个灵活的方式来描述 Linux 内核驱动程序的构建过程。Makefile 文件通常位于 Linux 内核驱动程序的根目录下。 * config 文件:...
搭建一个简易的C语言平台是学习C语言的重要步骤,它能帮助我们清晰地理解程序的编译、链接过程,以及各个文件在其中的作用。在这个环境中,我们通常会使用TC(Turbo C)编译器,这里特别提到了TC 2.0版本。以下是...
但是,在刚开始试验时,我们还是出现了一些问题,比如在第一步中编译或使用依据掌握的C文件,记住带-g参数编译,但是我们组没有弄清楚怎么带-g参数编译,以为直接敲指令,结果一直不成功,后来通过同学之间的帮助...
- **开源特性**:Linux内核是开放源代码项目的一个典范,其源代码对所有人公开,任何人都可以查看、修改和分发。这种开放性吸引了全球开发者参与贡献,共同推动了Linux内核的发展。 #### 二、Linux内核体系结构 - ...
请教C语言问题
- **特色**:LinuxEden 是一个汇集了大量Linux技术文章和个人博客的技术社区,涵盖了Linux系统管理、编程开发等多个方面。 - **适用人群**:适合对Linux有一定兴趣和技术基础的用户。 - **核心功能**: - 技术文章...
总的来说,Linux内核编译是一个细致且需要耐心的过程,涉及到硬件识别、功能选择、错误排查等多个环节。只有充分理解每个步骤的作用和可能遇到的问题,才能成功地编译出符合需求的内核。同时,对于新手来说,阅读...
课程内容首先通过一个情景导入的方式激发学生的兴趣,老师以自己即将面临听课的紧张心情为例,向学生们求教如何缓解紧张情绪,从而引入到请教的主题。随后,通过组织闯关游戏的方式,让学生在实践中学习如何向他人...
最后,Linux 是用 C 语言编写的,我们有学习 C 语言的基础,读程序和编写代码方面存在的困难小一点,也是我们能较快掌握的原因之一。 在学习的过程中,我们用的是 VM 虚拟机,开始时真的不真的该怎么去做,特别是我...
- 新建一个.C文件,写入主函数(`main()`)。 - 将MATLAB生成的C源代码文件(包括.C和.H文件)复制到项目目录,并在Visual Studio的“解决方案资源管理器”中添加这些文件。这将解决编译时找不到文件的错误。 - *...
实际上,随着Linux的成熟,如Ubuntu、Fedora等发行版已经提供了非常友好的用户界面,与Windows的差距大大缩小。例如,Android手机操作系统就是基于Linux内核的,其市场占有率证明了Linux的易用性。 另一种错误思想...
你提供的压缩包文件"liegie.m"可能是一个MATLAB脚本,MATLAB是一个广泛用于数值计算的环境,但是否可以直接用于能带结构计算取决于脚本的具体内容。如果你需要进行能带计算,可能需要熟悉上述步骤,并确保MATLAB脚本...
学生需要编写一个crontab文件,设置两个定时任务,分别对应上午12:00和下午17:30执行`autobackupdata1.shell`和`autobackupdata2.shell`脚本。通过`crontab -e`命令可以编辑当前用户的crontab配置。 **4. 验证与...
根据给定的文件信息,我们可以总结出一系列关于RedHat FedoraCore Linux6安装的关键知识点: ### 知识点一:FedoraCore Linux6简介 FedoraCore Linux6是Red Hat公司推出的一款基于GNU/Linux的开源操作系统,它继承...
实验过程中可能遇到的问题,如对命令不熟悉、输入错误等,可以通过讨论、请教和反复实践来解决。 实验总结强调了对GCC基本操作和命令的理解,以及通过实践加深了对编译过程的认识。尽管实验简单,但严谨的学习态度...
C语言课程设计是一个旨在帮助学生深入理解和应用C语言编程的实践项目。以下是一些关于C语言课程设计的基本步骤和建议: 明确目标和需求:首先,你需要与授课教师或课程设计的相关人员沟通,明确课程设计的需求。这...
C语言是一种基础且强大的编程语言,广泛应用于系统开发、软件工程、游戏制作、嵌入式系统等多个领域。学习C语言有助于理解计算机底层工作原理,提升编程思维能力。 本书的21天学习计划旨在通过系统性的学习和实践,...
在IT行业中,问题请教工程是一项常见且至关重要的任务。它涉及到技术咨询、故障排查、解决方案设计等多个环节,是提升技术水平和团队协作效率的关键。在这个场景下,"问题请教工程"可能指的是开发者或工程师在遇到...