当前位置:  技术问答>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);
}

|
这种问题一般是发送的数据包太大了,  应该用一个循环来接收数据,  

例如:
    int nTotalsize =1000;
  while(nTotalsize >= 0)
{

   int nRev = read(socket, buf, sizeof(buf));

   nTotalsize -= nRev;

}

网络情况不好的话,会出现分几次发送完缓冲区中的数据的情况,所以这个时候应该用循环来接收。

|
有这种情况:
write()的返回值并不等于所发送数据的大小同时也不等于-1,意味着buffer中还有一部分数据可能因为网络缓冲区满了而没有
发完,因此有必要再次把buffer中剩余的数据通过调用write发送一次,如果还是没有发完则继续重复此过程。

|
flush一下看看,
是不是数据没有完全传过去阿。
应该不是丢数据的问题。

    
 
 

您可能感兴趣的文章:

  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • linux 繁体 汉字输入法 问题 linux 繁体 汉字输入法 问题
  • Linux 下c++开发error while loading shared libraries问题解决
  • 先安装linux,后安装winxp,能否解决正常启动linux的问题不?(初学者问题,很容易回答)
  • 弱弱的一问,linux下的中文问题及网络问题,分不是问题
  • Linux新手问,Linux安装问题。
  • linux下游戏问题。(菜鸟问题)
  • 初学Linux,发现Linux下的版本问题很头痛。【系列问题】
  • 高深问题:有了linux内核源代码如何做成一个linux操作系统
  • 一个很菜的问题,关ARM与linux内核裁剪的问题!
  • vmware装的linux,通过win2000访问linux的web服务器有问题
  • 初次接触linux,关于linux 用户权限问题请教!
  • Linux下是否存在磁盘碎片问题和内存碎片问题?
  • linux开发的应用程序部署到其他linux的问题
  • vmware上装LINUX的问题,WIN7可以拼的通linux的IP,linux拼不通win7的IP
  • Linux互ping在局域网内大量丢包,但是linux和windows互ping就没问题。
  • 最菜的问题—关于linux“动态库”的问题
  • linux下挂载linux分区的问题
  • 一个小问题。Linux下编程语言的问题。
  • linux问题 secureCRT连接的问题 在线等急!~~
  • Linux下环境变量问题以及FLEX安装问题
  • 初用Linux,请问各位大侠,哪一款Linux支持Oracle9i
  • 各位大侠,求助Linux下关机
  • 各位大侠,学linux,现在又不想自己装一个,以前记得有个在线的,可以供大众访问的linux系统...
  • 各位大侠请问现在学那一种Linux好?
  • 网络技术 iis7站长之家
  • 哪位大侠知道ssldump在linux下怎么用?高分相送,谢谢
  • 哪位大侠有unix/linux的函数和函数所在的文件
  • 请问各位大侠:有没有《linux下QT编程入门》这本书的完全版?
  • linux学习的资料问题,请大侠推荐
  • 大侠,求助!!LINUX下TCP套接字编程中客户端出现段错误
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux!我来了------我是新人,还请大家多多帮忙
  • 装linux遇到问题,有高手在线帮忙吗?请发信息给我
  • 各位,帮忙推荐几本深入学习Linux的书!!!
  • 请问想学linux,请帮忙推荐一本好书?
  • 关于linux裁剪内核,越小越好。大家多多帮忙。
  • 我的linux声卡装不上,达人帮忙!
  • linux下的串口编程比较熟悉,麻烦帮忙!
  • 高手帮忙!linux初次安装的问题?
  • 高手们快来帮帮忙啊,,好郁闷!!!LINUX 9.0装不上的问题!
  • 帮忙推荐一本linux编程的好书!!!
  • 大家帮忙,推荐个好版本的Linux
  • 急!高手帮忙!cximage库在Linux下运行使用的问题。
  • 帮忙推荐个linux
  • linux的网络访问?请帮忙!
  • ★★★在linux下编译pro*c文件,提示"sqlcxt"没有定义,哪位高手帮忙,定赠分!
  • 急!大家帮帮忙!有哪些视频点播系统能在在LINUX下安装以及怎样安装!
  • 急!大家帮帮忙!有什么视频点播系统能在LINUX下安装,以及怎样安装!!
  • 请各位帮忙推荐几本Linux多进程编程的好书
  • 升级Linux的问题,急!请高手帮忙!
  • Linux学习,高手帮忙
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3