TCP 非阻塞套接字 发送文件数据会丢失

问题描述

TCP 非阻塞套接字 发送文件数据会丢失

用以下函数将套接字设置为非阻塞套接字
bool setSockNoBlock(SOCKET s)
{
bool flg=true;
if (::ioctlsocket(s, FIONBIO, (unsigned long )&flg)==0)
{
cout<<"socket"<
return true;
}
return false;
}
发送文件代码:
bool sendFile(SOCKET s,char *fileName)
{
CWGFILE wgSendFile;
char buf[WG_MAX_TCPBUF];
ZeroMemory(buf,WG_MAX_TCPBUF);
int len=0;
int fileLen=0;
int count=0;
double timeCount;
CTimer t;
if (wgSendFile.WG_FileOpen(fileName,WG_FILE_READ))
{
t.Start();
while((len=wgSendFile.WG_FileRead(buf))>0)
{
fileLen+=len;
send(s,buf,len,0);
/*Sleep(1);
/
// cout<<count<<":"<<len<<" ";
count++;
if (fileLen == wgSendFile.WG_FileLen())
{
timeCount = t.End();
cout<<"发送时间:"<<(double)(timeCount/1000.0)<<"S"<<endl;
cout<<"发送速度:"<<(double)(fileLen/1024.0/1024.0)/(timeCount/1000.0)<<"M/S"<<endl;
return wgSendFile.WG_FileClose(), true;
}
ZeroMemory(buf,WG_MAX_TCPBUF);
}
}
return false;
}

接收数据方代码:
do
{
nRet = recv(sockClient,buf,WG_MAX_TCPBUF,0);
if (nRet>0)
{
len+=nRet;
wgRecvFile.WG_FileWrite(buf,nRet);
ZeroMemory(buf,WG_MAX_TCPBUF);
//cout<<count<<":"<<nRet<<" ";
count ++;
if (len == 941473792 )//本应该接收的数据长度
{
cout<<"n接受终于完了!"<<endl;
break;
}
}
if (nRet==0)
{
cout<<"n服务器断开了,共接收数据:"<<len<<endl;
break;
}
} while (nRet!=0);

时间: 2016-02-11

TCP 非阻塞套接字 发送文件数据会丢失的相关文章

实现非阻塞套接字的一种简单方法 使用 JSSE 和 NIO 实现非阻塞通信的一种快速方法

简介: 尽管 SSL 阻塞操作――当读写数据的时候套接字的访问被阻塞――与对应的非阻塞方式相比提供了更好的 I/O 错误通知,但是非阻塞操作允许调用的线程继续运行.本文中,作者同时就客户端和服务器端描述了如何使用Java Secure Socket Extensions (JSSE) 和 Java NIO (新 I/O)库创建非阻塞的安全连接,并且介绍了创建非阻塞套接字的传统方法,以及使用JSSE 和 NIO 的一种可选的(必需的)方法. 阻塞,还是非阻塞?这就是问题所在.无论在程序员的头脑中多

JDK1.4非阻塞套接字API概述

J2SE 1.4版引入了非阻隔套接字(Nonblocking sockets),它允许在网络通信应用程序和没有阻隔的进程中使用套接字.本文将详细介绍什么是非阻隔套接字(Nonblocking sockets)及其工作原理和用途. 从Java 1.4起,程序员便能用一组新的API来进行I/O操作.这是JSR 51项目的结果,自2000年1月的Java 1.4 beta版,程序员便可以使用JSR 51了.在Java 1.4中增加了一些非常重要的新技术来处理诸如在文件和套接字上进行高性能的读/写操作,

原始套接字发送自己封装的TCP/IP包,加线程后速度也上不去是什么原因

问题描述 原始套接字发送自己封装的TCP/IP包,加线程后速度也上不去是什么原因 情况是这样,我需要发送自己构造的数据包,将数据封在TCP包中,然后再封在IP包中,最后再发送出去 现在要尽可能达到最快的发送速度,我的方案是先创建一个字符串数组,用于存放已经构造好的数据包,然后程序运行时先把数据包构造好并保存在数组中,然后在启动发包的线程 我的带宽是1000M,当启动一个线程时,发包速度大约是170M,CPU占用率40%左右,但是加到10个进程时速度也就是190M,cpu 50%---60%,加到

原始套接字 tcp-用原始套接字发送TCP数据包,显示发送成功但是接收不到,求教

问题描述 用原始套接字发送TCP数据包,显示发送成功但是接收不到,求教 我需要自己构建IP数据包,在IP选项部分添加一些数据,因此用原始套接字发送TCP数据包,但是发送成功了,另一台主机接收不到,用的2003系统,不知道哪位好心人能帮助下,万分感激,谢谢 解决方案 你这个问题说的比较笼统,你是用的无连接发送吧,发送成功了,但是主机没收到,可能:1.IP包或者TCP包创建的有问题2.发送过程中,数据有丢失3.服务器的程序,在接受数据的程序上存在一些问题 解决方法:1.在客户端断点检测,查看IP和T

sock-怎么用python和原始套接字发送一tcp数据包?

问题描述 怎么用python和原始套接字发送一tcp数据包? 这段代码直接把数据packet_base作为ip的载荷了,怎么才能是packet_base作为tcp的载荷呢?谢谢 sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) sock.sendto(packet_base, 0, (IP_PACKET_IN, 12321)) sock.close() 解决方案 把你的代码修改成如下就是TCP啦:

linux tcp socket-socket编程可以使用同一个套接字发送和接受吗

问题描述 socket编程可以使用同一个套接字发送和接受吗 RT,我先bind了一个sockfd,用它send了部分数据给服务器,我想接受服务器的反馈信息,于是想用listen来监听服务器发过来的数据,但是好像不行啊,在listen的时候出错了...一定要close掉之后再建立一个socket吗? 解决方案 服务器才是listen,你想接收服务器的反馈信息,人家直接通过这个链接给你就行了.咱们的好多书都是瞎讲,或者是不讲.

VC中TCP实现 异步套接字编程的原理+代码

所谓的异步套接字编程就是  调用了 如下函数   WSAAsyncSelect   设置了 套接字的状态为异步,有关函数我会在下面详细介绍... 异步套接字解决了 套接字编程过程中的堵塞问题 ...... 什么是堵塞?请看下面  你可能有过这样的体会  在  VC编写基于界面的网路程序时候  ,调用 recv recvfrom   accept  等函数的时候 整个程序的主线程进入堵塞状态直到 有连接或者信息的到来.  我们可以利用多线程的方法解决主线程堵塞的问题,但是我们如果一个程序需要多个套

代码-linux的xterm开启的终端里使用原始套接字发送数据包出错,求助

问题描述 linux的xterm开启的终端里使用原始套接字发送数据包出错,求助 xterm下原始套接字可以接收数据包,但是发送数据包时出错,怎么解决? 错误是[error 101]network is unreachable. 代码如下: proto = socket.getprotobyname('tcp') # only tcp sock = socket.socket( socket.AF_INET, socket.SOCK_RAW, proto ) packet_base = sock.

数据在协议栈中的传递-用原始套接字截取数据链路层数据,那这包数还会在TCP/IP协议栈中传递吗

问题描述 用原始套接字截取数据链路层数据,那这包数还会在TCP/IP协议栈中传递吗 用原始套接字写了一个小程序,装在本机后,能够截取本机的发送/接收数据,想问一下,比如原始套接字程序在数据链路层截取到一个别人发给本机的数据,原始套接字程序截取到后,这包数还会向网络层上传,一步步再送到截取这包数的真正端口进程吗?会不会我一截取,该收到这包数的进程就收不到了呢? 解决方案 看你怎么截取的,一般是拦截,不影响数据包的发送. 解决方案二: 如果你不是通过驱动等,很可能你拿到的只是一份拷贝,所以数据还是继