上面的排版有些问题,请看这里:
msdn中说:对于非阻塞的套介子,send(...)返回
1.SOCKET_ERROR:发生错误,如果网络没有问题,通常为缓冲区满.
2.int 类型的正数 返回值有可能不发送的字节数小.
据此:我想用非阻塞套介子casyncsocket发送文件onsend中的代码如下.
发送一个22M的文件时,在发送15M左右,程序变为没有响应.菜鸟实在不知
原因如何,请高手指点:
CFile file;//要发送的文件
file.Open("d:/testsend/testsrc",CFile::modeRead¦CFile::shareDenyNone);//打开文件
int sendlen;//每次从文件中读出的长度,只在结尾时才不等于1000
char buffer[1000];
int sended=0;//buffer 中已经发送的字节数
while((sendlen=file.Read(buffer,1000))>0){
int ret;
while(1) {
ret=Send(buffer+sended,sendlen);
if (ret==SOCKET_ERROR){//如果返回SOCKET_ERROR重新发送
Sleep(10);continue;
}
if(ret==sendlen)break;//如果发送完全,跳出
sended+=ret; //已发送字节数增加ret
sendlen-=ret; //剩余字节数减少ret
}
}
msdn中说:对于非阻塞的套介子,send(...)返回
1.SOCKET_ERROR:发生错误,如果网络没有问题,通常为缓冲区满.
2.int 类型的正数 返回值有可能不发送的字节数小.
据此:我想用非阻塞套介子casyncsocket发送文件onsend中的代码如下.
发送一个22M的文件时,在发送15M左右,程序变为没有响应.菜鸟实在不知
原因如何,请高手指点:
CFile file;//要发送的文件
file.Open("d:/testsend/testsrc",CFile::modeRead¦CFile::shareDenyNone);//打开文件
int sendlen;//每次从文件中读出的长度,只在结尾时才不等于1000
char buffer[1000];
int sended=0;//buffer 中已经发送的字节数
while((sendlen=file.Read(buffer,1000))>0){
int ret;
while(1) {
ret=Send(buffer+sended,sendlen);
if (ret==SOCKET_ERROR){//如果返回SOCKET_ERROR重新发送
Sleep(10);continue;
}
if(ret==sendlen)break;//如果发送完全,跳出
sended+=ret; //已发送字节数增加ret
sendlen-=ret; //剩余字节数减少ret
}
}
解决方案 »
- 求助CTreeCtrl
- 请前辈帮忙扫一眼:vc++6.0中的CString咋没人恢复呢,欺负新人吗?嘿嘿
- CMap声明问题
- ++++鸟人!第一个问题回答不对的不给分++++
- 急待解決:能否改变CListView网格的颜色???
- 在ACCESS中设了安全密码后,就出现IDispatch error #3149这个错误,该怎么办?
- WM_TIMER的问题。
- 请问我想在程序里面动态的改变在FormView 里面的一个static text的背景及字体颜色,应该如何做?
- WideCharToMultiByte,怎么把UNICODE转换成ASCII
- 关于多语言版本的问题
- 怎样才能设计一个产品化的,强壮和高效率的Socket服务器程序,求教资深程序员
- CEditView有64K的限制
while((sendlen=file.Read(buffer,1000))>0){
int ret, sent;
sent = 0;
while(1) {
/*sended的值通常会超过1000的,除非你的文件小于1k。*/
ret=Send(buffer+sent,sendlen);
if (ret==SOCKET_ERROR){//如果返回SOCKET_ERROR重新发送
ASSERT( WSAEWOULDBLOCK == WSAGetLastError() );
/*如果出现ASSERT错误请检查WSAGetLastError()的值*/
Sleep(10);continue;
}
if(ret==sendlen)break;//如果发送完全,跳出
sended+=ret; //已发送字节数增加ret
sent += ret;
sendlen-=ret; //剩余字节数减少ret
}
}
long err=GetLastError();
TRACE("ERROR=%d",err);
当err的值不为0时,检查一下出错值,并查明原因,同时,Sleep()语句的时间可以再长一点。
关于socket通信,服务端的程序,希望大家能列举用过的模型,并进行讨论。