当前位置:  技术问答>linux和unix

socket write传输文件数据不全(附源码)

    来源: 互联网  发布时间:2017-04-29

    本文导语:  各位好:        写了一个socket程序,大致实现功能是将一个服务器传输过来的文件转发给另一台服务器,功能基本完成,但是还有一个问题就是我这个程序转发数据到另一台服务器的时候会发生数据丢失。但是我...

各位好:
       写了一个socket程序,大致实现功能是将一个服务器传输过来的文件转发给另一台服务器,功能基本完成,但是还有一个问题就是我这个程序转发数据到另一台服务器的时候会发生数据丢失。但是我在close(socket)之前sleep(1)就好了,还是有些疑惑。希望知道的事情如下:

1.程序确实已经将read过来的数据write成功了(write的返回值不会骗人吧),感觉是我这边close太快而导致写缓冲区的内容没有传输到另一台服务器,假使是这样那么我在close(socket)之前是否有什么函数可以确认一下当前写缓冲区有什么内容?是否已经发送完毕?

2.如果不是像第一个问题描述的那样,会是什么问题?

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define SERVPORT 8090
#define MAXDATASIZE 1024

int do_con_n(char *address, int port)
{
int s;  
struct sockaddr_in sin;
fd_set set;
struct timeval timeo = {15, 0}; //time ou struct
socklen_t len = sizeof(timeo);
int retval;
int error;
  
  s=socket(AF_INET, SOCK_STREAM, 0);  
 // x=fcntl(s,F_GETFL,0);              // Get socket flags  
  fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK); //设置为非阻塞模式  
  memset(&sin, 0, sizeof(struct sockaddr_in));  
  sin.sin_family=AF_INET;  
  sin.sin_port=htons(port);  
  //sin.sin_addr.s_addr=name_resolve(address);  
  sin.sin_addr.s_addr = inet_addr(address);
  if(!sin.sin_addr.s_addr) return(-1);  
  //printf("ip: %sn",inet_ntoa(sin.sin_addr));  
  if(connect(s, (struct sockaddr *)&sin, sizeof(sin))!=0)
  {
   if (errno != EINPROGRESS) 
   { 
       printf("connect:normal network unreach!!");
       return -1;
    }
     FD_ZERO(&set);/*将set清零使集合中不含任何fd*/ 
   FD_SET(s,&set); /*将一个给定的文件描述符加入集合之中*/ 
   retval = select(s + 1, NULL, &set, NULL, &timeo);
   if (retval == -1) 
   {
     printf("select");
     return -1;
   } 
   else if(retval == 0) 
   {
     printf("timeoutn"); //这样的select等于是变成了再timeout时间内是阻塞模式,超过timeout就直接返回
     printf("%dn", time(NULL));
     return 0;
   }
   else
   {
    printf("connected--->:[%d]n",retval);
    getsockopt(s, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len); //判断在connected成功之后,获取套接口目前的一些信息来判断是否真的是连接上了,返回0表示真的连上了
    //printf("error--->:[%d]n",error);
   
    if(0!=error)
    {
    printf("error--->:[%d]n",error);
    perror("error");
    return -1;
    }
   }
    
  } 
   
return(s);  
}

int SeanSend(int fd, void *buffer, int length)  
{  
    int bytes_left;   
    int written_bytes;   
    char *ptr=NULL;   
    ptr=(char *)buffer;   
    bytes_left=length;  
    
    while( bytes_left>0)   
    {   
        /* 开始写*/
        written_bytes=write(fd, ptr, bytes_left);
        //printf("nin seasend:written_bytes=[%d]n",written_bytes);
        if(written_bytessockfd1?sockfd:sockfd1)+1, &rdfds, NULL, NULL, NULL );
if(ret0)
{
wrtlen=SeanSend(sockfd1,rcv_buf,rcvlen);
//printf("nwrtlen=[%d]n",wrtlen);
}
else if(0==rcvlen)
{
break;
}
else
{
 printf("sockfed ERROR: errno = %d, strerror = %s n"  
                                , errno, strerror(errno)); 
}

}

if(FD_ISSET(sockfd1, &rdfds))
{
//printf("go11n");
memset(rcv_buf, 0x00, sizeof(rcv_buf));
if((rcvlen1=read(sockfd1, rcv_buf, MAXDATASIZE))>0)
{
wrtlen1=SeanSend(sockfd,rcv_buf,rcvlen1);
//printf("nwrtlen1=[%d]n",wrtlen1);
}
else if(0==rcvlen1)
{
break;
}
else
{
printf("sockfed1 ERROR: errno = %d, strerror = %s n"  
                                , errno, strerror(errno)); 
}

}
//continue;
}
}
sleep(1);//如果不sleep文件基本上传输不全
close(sockfd);//TCP 单向关闭
close(sockfd1);
    return 0;
}

|

这个不一定,主动关闭端一般会有time_wait状态,在一定时间内接受数据(允许数据在网路中消失),但这些接收到的数据应该是丢掉的,应用是拿不到的。也可以设置socket选项不理这种情况

    
 
 

您可能感兴趣的文章:

  • 请教有关socket的问题,并求telnetd的c源码
  • socket函数源码
  • 求Servlet与applet通过socket通讯,相关资料或源码,网址都行!谢谢啦。
  • 求socket源码:一个最简单的下载工具
  • 三种获取网页源码的方法(使用MFC/Socket实现)
  • 哪位大虾有数据报Socket客户端例子的java源码?急……
  • socket实现多文件并发传输,求助多线程实现问题?
  • 高手啊,请问如何将BufferedImage转换为可以用SOCKET传输的数据
  • linux无线网络传输也可以直接使用socket接口编程吗?
  • 如何用socket一次传输多个文件,如何确定文件一个文件结束
  • linux 下如何图片如何通过socket传输?
  • JB5 Socket传输的汉字如何正常显示???
  • socket传输二进制文件输出是不是要用DataOutputStream?
  • socket(套接字)怎么传输二进制数据?急
  • socket传输
  • (在下等)如何解决socket 传输的丢包问题
  • linux下tcp协议的socket可靠传输
  • 对于socket UDP传输,一个端口只能被一个进程绑定?
  • socket 实现图片传输?
  • socket传输int型数字的问题
  • 用ARMV41-UNKNOWN_LINUX-GCC编译出的Socket程序传输结构体出问题,请大家帮忙分析一下
  • 各位高手,怎么在J2ME中进行socket传输呀?请帮忙给个提示。
  • Socket传输中文字符处理!!高分求救
  • 难道还有第3条分支???怎么判断 socket 的数据已经传输
  • 如何通过Socket传输对象?
  • 帮我看下UNIX下用SOCKET实现文件传输哪出错了
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于文件操作和Socket网络编程!
  • Linux下怎么用socket接收zip文件流?怎么把zip文件读成流?
  • liunx下面包含socket头文件了,close时提示尚未声明???
  • 初来者,试问winsock改造成gcc socket需要什么头文件?
  • socket程序中,查看error需要什么头文件?
  • socket传送文件 客户端收到的文件和服务器端发送的不一样?
  • [高分相送200] 谁有linux下socket编写的发送文件源代码?(解决另开贴)
  • 内核源文件/net/socket.c中调用其他模块的函数,该如何实现
  • socket编程为什么.cpp文件编辑通不过
  • 请教linux下c用下载FTP站点中文件的socket程序思路
  • 请问一下,有谁知道linux源代码中socket(int domain, int type, int protocol);函数的定义是在哪个文件中啊?小弟我找了很久,都没找到,谢谢哈。
  • hpunix gcc 包含socket.h 文件报错
  • 如何利用socket传文件(不同格式的)?高分求救!!---在线等待
  • 一个简单的SOCKET服务端程序,生成执行文件的出错!
  • 包含了头文件sys/socket.h等,编译链接的时候却报错,是什么问题呢
  • gcc编译socket小程序成功,但生成的文件却无法执行
  • socket传送文件问题
  • 高分求救:SOL_SOCKET,SO_RCVTIMO,SO_SNDTIMEO,IPPOTO_TCP,TCP_NODELAY这些是在哪个头文件定义的呢?
  • close掉socket后,在accept了1024次后,出现打开文件最大限制1024的问题
  • php与flash as3 socket通信传送文件实现代码
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍


  • 站内导航:


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

    ©2012-2021,