0 0

请教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;
}

     
C 
2009年6月22日 16:20
目前还没有答案

相关推荐

    在linux下实现的一个简单的广告机

    本项目是关于在Linux环境下利用Qt框架构建一个简单的广告机应用。广告机的主要功能是展示HTML格式的广告内容,并可能通过CGI(Common Gateway Interface)程序与服务器进行交互,实现动态更新或者定制化服务。以下是...

    Linux内核构建系统1

    * Makefile 文件:Makefile 文件是 Linux 内核构建系统的另一个核心文件。它提供了一个灵活的方式来描述 Linux 内核驱动程序的构建过程。Makefile 文件通常位于 Linux 内核驱动程序的根目录下。 * config 文件:...

    搭建一个简易的C语言平台

    搭建一个简易的C语言平台是学习C语言的重要步骤,它能帮助我们清晰地理解程序的编译、链接过程,以及各个文件在其中的作用。在这个环境中,我们通常会使用TC(Turbo C)编译器,这里特别提到了TC 2.0版本。以下是...

    嵌入式Linux GDB调试技术

    但是,在刚开始试验时,我们还是出现了一些问题,比如在第一步中编译或使用依据掌握的C文件,记住带-g参数编译,但是我们组没有弄清楚怎么带-g参数编译,以为直接敲指令,结果一直不成功,后来通过同学之间的帮助...

    LINUX内核完全剖析

    - **开源特性**:Linux内核是开放源代码项目的一个典范,其源代码对所有人公开,任何人都可以查看、修改和分发。这种开放性吸引了全球开发者参与贡献,共同推动了Linux内核的发展。 #### 二、Linux内核体系结构 - ...

    请教C语言问题

    请教C语言问题

    linux学习网站 ,linux学习网站

    - **特色**:LinuxEden 是一个汇集了大量Linux技术文章和个人博客的技术社区,涵盖了Linux系统管理、编程开发等多个方面。 - **适用人群**:适合对Linux有一定兴趣和技术基础的用户。 - **核心功能**: - 技术文章...

    linux内核编译总结

    总的来说,Linux内核编译是一个细致且需要耐心的过程,涉及到硬件识别、功能选择、错误排查等多个环节。只有充分理解每个步骤的作用和可能遇到的问题,才能成功地编译出符合需求的内核。同时,对于新手来说,阅读...

    部编三年级上册语文口语交际:请教.pdf

    课程内容首先通过一个情景导入的方式激发学生的兴趣,老师以自己即将面临听课的紧张心情为例,向学生们求教如何缓解紧张情绪,从而引入到请教的主题。随后,通过组织闯关游戏的方式,让学生在实践中学习如何向他人...

    linux学习心得.doc

    最后,Linux 是用 C 语言编写的,我们有学习 C 语言的基础,读程序和编写代码方面存在的困难小一点,也是我们能较快掌握的原因之一。 在学习的过程中,我们用的是 VM 虚拟机,开始时真的不真的该怎么去做,特别是我...

    vs2016调用matlab2016a编译成的c文件【优质】.docx

    - 新建一个.C文件,写入主函数(`main()`)。 - 将MATLAB生成的C源代码文件(包括.C和.H文件)复制到项目目录,并在Visual Studio的“解决方案资源管理器”中添加这些文件。这将解决编译时找不到文件的错误。 - *...

    新手如何搞定Linux操作系统.pdf

    实际上,随着Linux的成熟,如Ubuntu、Fedora等发行版已经提供了非常友好的用户界面,与Windows的差距大大缩小。例如,Android手机操作系统就是基于Linux内核的,其市场占有率证明了Linux的易用性。 另一种错误思想...

    liegie_文件有点问题请教一下_

    你提供的压缩包文件"liegie.m"可能是一个MATLAB脚本,MATLAB是一个广泛用于数值计算的环境,但是否可以直接用于能带结构计算取决于脚本的具体内容。如果你需要进行能带计算,可能需要熟悉上述步骤,并确保MATLAB脚本...

    linux-用shell编程调度的实验报告.doc

    学生需要编写一个crontab文件,设置两个定时任务,分别对应上午12:00和下午17:30执行`autobackupdata1.shell`和`autobackupdata2.shell`脚本。通过`crontab -e`命令可以编辑当前用户的crontab配置。 **4. 验证与...

    RedHat FedoraCore Linux6安装图解

    根据给定的文件信息,我们可以总结出一系列关于RedHat FedoraCore Linux6安装的关键知识点: ### 知识点一:FedoraCore Linux6简介 FedoraCore Linux6是Red Hat公司推出的一款基于GNU/Linux的开源操作系统,它继承...

    GCC编译器起步

    实验过程中可能遇到的问题,如对命令不熟悉、输入错误等,可以通过讨论、请教和反复实践来解决。 实验总结强调了对GCC基本操作和命令的理解,以及通过实践加深了对编译过程的认识。尽管实验简单,但严谨的学习态度...

    大一上c语言课程设计写的超市管理系统.zip

    C语言课程设计是一个旨在帮助学生深入理解和应用C语言编程的实践项目。以下是一些关于C语言课程设计的基本步骤和建议: 明确目标和需求:首先,你需要与授课教师或课程设计的相关人员沟通,明确课程设计的需求。这...

    21天学通C语言电子版

    C语言是一种基础且强大的编程语言,广泛应用于系统开发、软件工程、游戏制作、嵌入式系统等多个领域。学习C语言有助于理解计算机底层工作原理,提升编程思维能力。 本书的21天学习计划旨在通过系统性的学习和实践,...

    问题请教工程,问题请教工程

    在IT行业中,问题请教工程是一项常见且至关重要的任务。它涉及到技术咨询、故障排查、解决方案设计等多个环节,是提升技术水平和团队协作效率的关键。在这个场景下,"问题请教工程"可能指的是开发者或工程师在遇到...

Global site tag (gtag.js) - Google Analytics