当前位置: 技术问答>linux和unix
Linux环境下socket编程问题!请大侠们帮忙看看问题出在哪?
来源: 互联网 发布时间:2016-03-10
本文导语: 程序功能:在Linux下实现文件上传,接收程序,服务器端接收客户端发送的文件(文件类型任意), 然后将文件保存在本地的一个目录中。服务器保存的文件名与客户端的一致。 问题:当程序上传的...
程序功能:在Linux下实现文件上传,接收程序,服务器端接收客户端发送的文件(文件类型任意),
然后将文件保存在本地的一个目录中。服务器保存的文件名与客户端的一致。
问题:当程序上传的文件较大时
向服务器端实际发送的数据并不是每次都是事先设定的值
上传小文件时并不会出现这样的情况
当快速上传小文件时,会出现服务器端接收到的数据长度和从客户端发送过来的数据长度不一样的情况
请大侠们帮帮忙;
弄了好几天了;
没找到原因在哪;
谢谢!!!
下面是客户端源代码
附件有服务器端源代码
/******* 客户端程序 (client.c) ************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXSIZE 2048
int main(int argc, char *argv[])
{
int iRet = 0;
int sockfd;
char buffer[MAXSIZE];
char netbuffer[MAXSIZE];
char rebuffer[MAXSIZE];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;
long lFileLength;
int fd;
int size;
int w_size = 0;
bzero(buffer,sizeof(buffer));
bzero(netbuffer,sizeof(netbuffer));
bzero(rebuffer,sizeof(rebuffer));
FILE *fp;
if(argc!=4)
{
fprintf(stderr,"Usage:%s hostname portnumberan",argv[0]);
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname errorn");
exit(1);
}
if((portnumber=atoi(argv[2]))h_addr);
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%san",strerror(errno));
exit(1);
}
/* 连接成功了 */
//打开上传文件
if((fp = fopen(argv[3],"rb")) == NULL)
{
fprintf(stderr,"%s file dosen't opn.",argv[3]);
exit(1);
}
//获得文件长度
fseek(fp,0L,SEEK_END);
lFileLength = (long)ftell(fp);
fseek(fp,0L,SEEK_SET);
fclose(fp);
fprintf(stderr,"lFileLength:%dn",lFileLength);
//将文件路径,文件长度存入netbuffer准备发送
bzero(netbuffer,sizeof(netbuffer));
sprintf(netbuffer,"%s%d",
argv[3],lFileLength);
//向服务器发送数据文件路径,文件长度
if(write(sockfd,netbuffer,strlen(netbuffer))==-1)
{
fprintf(stderr,"Write Error:%sn",strerror(errno));
exit(1);
}
fprintf(stderr,"netbuffer:%sn",netbuffer);
//读文件内容
if( -1 == (fd = open(argv[3],O_RDONLY)) )
{
fprintf(stderr,"%s file dosen't opn.",argv[3]);
exit(1);
}
while ( 1 )
{
bzero(buffer,sizeof(buffer));
size = read (fd,buffer,sizeof(buffer));
if ( 0 == size ) //文件结束
{
break;
}
//向服务器端发送文件内容
w_size = write(sockfd,buffer,strlen(buffer));
if( -1 == w_size )
{
fprintf(stderr,"Write Error:%sn",strerror(errno));
break;
}
fprintf(stderr,"w_size:%dn",w_size);
}
close(fd);
bzero(rebuffer,sizeof(rebuffer));
//等待服务器端返回信息
while(1)
{
if((nbytes=read(sockfd,rebuffer,MAXSIZE))==-1)
{
fprintf(stderr,"Read Error:%sn",strerror(errno));
exit(1);
}
if(0 != strlen(rebuffer))
{
rebuffer[nbytes]='';
printf("%sn",rebuffer);
break;
}
}
/* 结束通讯 */
close(sockfd);
exit(0);
}
然后将文件保存在本地的一个目录中。服务器保存的文件名与客户端的一致。
问题:当程序上传的文件较大时
向服务器端实际发送的数据并不是每次都是事先设定的值
上传小文件时并不会出现这样的情况
当快速上传小文件时,会出现服务器端接收到的数据长度和从客户端发送过来的数据长度不一样的情况
请大侠们帮帮忙;
弄了好几天了;
没找到原因在哪;
谢谢!!!
下面是客户端源代码
附件有服务器端源代码
/******* 客户端程序 (client.c) ************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXSIZE 2048
int main(int argc, char *argv[])
{
int iRet = 0;
int sockfd;
char buffer[MAXSIZE];
char netbuffer[MAXSIZE];
char rebuffer[MAXSIZE];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;
long lFileLength;
int fd;
int size;
int w_size = 0;
bzero(buffer,sizeof(buffer));
bzero(netbuffer,sizeof(netbuffer));
bzero(rebuffer,sizeof(rebuffer));
FILE *fp;
if(argc!=4)
{
fprintf(stderr,"Usage:%s hostname portnumberan",argv[0]);
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname errorn");
exit(1);
}
if((portnumber=atoi(argv[2]))h_addr);
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%san",strerror(errno));
exit(1);
}
/* 连接成功了 */
//打开上传文件
if((fp = fopen(argv[3],"rb")) == NULL)
{
fprintf(stderr,"%s file dosen't opn.",argv[3]);
exit(1);
}
//获得文件长度
fseek(fp,0L,SEEK_END);
lFileLength = (long)ftell(fp);
fseek(fp,0L,SEEK_SET);
fclose(fp);
fprintf(stderr,"lFileLength:%dn",lFileLength);
//将文件路径,文件长度存入netbuffer准备发送
bzero(netbuffer,sizeof(netbuffer));
sprintf(netbuffer,"%s%d",
argv[3],lFileLength);
//向服务器发送数据文件路径,文件长度
if(write(sockfd,netbuffer,strlen(netbuffer))==-1)
{
fprintf(stderr,"Write Error:%sn",strerror(errno));
exit(1);
}
fprintf(stderr,"netbuffer:%sn",netbuffer);
//读文件内容
if( -1 == (fd = open(argv[3],O_RDONLY)) )
{
fprintf(stderr,"%s file dosen't opn.",argv[3]);
exit(1);
}
while ( 1 )
{
bzero(buffer,sizeof(buffer));
size = read (fd,buffer,sizeof(buffer));
if ( 0 == size ) //文件结束
{
break;
}
//向服务器端发送文件内容
w_size = write(sockfd,buffer,strlen(buffer));
if( -1 == w_size )
{
fprintf(stderr,"Write Error:%sn",strerror(errno));
break;
}
fprintf(stderr,"w_size:%dn",w_size);
}
close(fd);
bzero(rebuffer,sizeof(rebuffer));
//等待服务器端返回信息
while(1)
{
if((nbytes=read(sockfd,rebuffer,MAXSIZE))==-1)
{
fprintf(stderr,"Read Error:%sn",strerror(errno));
exit(1);
}
if(0 != strlen(rebuffer))
{
rebuffer[nbytes]='';
printf("%sn",rebuffer);
break;
}
}
/* 结束通讯 */
close(sockfd);
exit(0);
}
|
这种问题一般是发送的数据包太大了, 应该用一个循环来接收数据,
例如:
int nTotalsize =1000;
while(nTotalsize >= 0)
{
int nRev = read(socket, buf, sizeof(buf));
nTotalsize -= nRev;
}
网络情况不好的话,会出现分几次发送完缓冲区中的数据的情况,所以这个时候应该用循环来接收。
例如:
int nTotalsize =1000;
while(nTotalsize >= 0)
{
int nRev = read(socket, buf, sizeof(buf));
nTotalsize -= nRev;
}
网络情况不好的话,会出现分几次发送完缓冲区中的数据的情况,所以这个时候应该用循环来接收。
|
有这种情况:
write()的返回值并不等于所发送数据的大小同时也不等于-1,意味着buffer中还有一部分数据可能因为网络缓冲区满了而没有
发完,因此有必要再次把buffer中剩余的数据通过调用write发送一次,如果还是没有发完则继续重复此过程。
write()的返回值并不等于所发送数据的大小同时也不等于-1,意味着buffer中还有一部分数据可能因为网络缓冲区满了而没有
发完,因此有必要再次把buffer中剩余的数据通过调用write发送一次,如果还是没有发完则继续重复此过程。
|
flush一下看看,
是不是数据没有完全传过去阿。
应该不是丢数据的问题。
是不是数据没有完全传过去阿。
应该不是丢数据的问题。