为什么我fread把文本内容读出来后段错误呢还会有内存地址映射?LINUX下编程
- C/C++ code
if(argc!=1) { if((fp=fopen(argv[2],"r"))==NULL) { fprintf(stderr,"open %s failed!\n",argv[2]); return FALSE; } nbytes=send(sockfd,argv[2],strlen(argv[2]),0); if(nbytes==-1) { fprintf(stderr,"send filename: %s failed\n",argv[2]); return FALSE; } nbytes=0;// while(fgets(sendbuf,1024,fp)!=NULL) while((ret=fread(sendbuf,sizeof(char),MAXLEN,fp))>0) { ret=send(sockfd,sendbuf,strlen(sendbuf),0); printf("%d\n",strlen(sendbuf)); if(ret==-1) { fprintf(stderr,"send failed\n"); return FALSE; } nbytes+=ret*sizeof(char); printf("%s",sendbuf); memset(sendbuf,0,MAXLEN); } printf("\n"); printf("send file %s over,%d bytes of file\n",argv[2],nbytes); fclose(fp); }[解决办法]
ret=send(sockfd,sendbuf,strlen(sendbuf),0);
改为如下试试:
ret=send(sockfd,sendbuf,ret,0);
另外,ret最好再声明一个变量,一个变量的职责别太多
[解决办法]
楼上两位说的都需要你去改正。
另外,你并没有认真的判断send的返回值是否小于请求值,只是判断了返回-1的情况,如果要正确一定要严格的判断,循环保证发送完全。
[解决办法]
使用一个\0隔开就行了,接收端对于首个接受的\0做切分,之后的就是二进制数据。