socket收发

来源:互联网 发布:苹果app淘宝充值退款 编辑:程序博客网 时间:2024/06/04 21:37
您当前的位置:同创IT → 编程技术 →VC/MFC → 网络编程 → 文章信息基于TCP数据传输send/recv函数问题!--------------------------------------------------------------------------------做一个基于TCP的文件传输程序:发送端如下:SOCKETsockConn=accept(FileSock.FileSocket,(SOCKADDR*)&addrfrom,&length);do{dwRead=sourceFile.Read(sendBuf,10240);send(sockConn,sendBuf,dwRead,0);}while(dwRead>0);closesocket(sockConn);sourceFile.Close();//----------接收端如下:charrecvBuf[10240];//strlen(recvBuf)WORDFileByte;while(m_FileLength>0)//m_FileLength为接收文件的长度{FileByte=recv(FileSock.sockClient,recvBuf,sizeof(recvBuf),0);destFile.Write(recvBuf,10240);m_FileLength-=FileByte;}destFile.Close();AfxMessageBox("文件接收完成!",MB_OK,IDS_Msg);return0;其中,接收端和发送端所用的套节字在一个类中做的初始化!基初始化函数如下:BOOLCFileSocket::InitSocket()//文件发送端{FileSocket=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_INaddrsock;addrsock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrsock.sin_family=AF_INET;addrsock.sin_port=htons(8413);bind(FileSocket,(SOCKADDR*)&addrsock,sizeof(SOCKADDR));listen(FileSocket,10);returnTRUE;}//---BOOLCFileSocket::InitClientSock(CStringSrvIP)//接收端{SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_INaddrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr(SrvIP);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(8413);connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));return1;}现在,程序运行时,接收端不停的接收数据,就算我把发送端的send函数屏蔽掉,它同样也在不停的接收数据,而接收到的数据都是乱码。发送端也一样,不停的往外发送数据,就算我把客户的recv函数屏蔽掉,那也同样不停的发送数据。也不知道到里是不是发送到客户端去了。按道理,基于TCP的SOCKED编程应该是在阻塞下执行的,也就是服务器端的send函数要把数据发送成功才进行返回,可是这里也没有看到这种情况!希望高手们帮忙看看,到里程序错在那里,我查了半天也没有找出问题来。--------------------------------------------------------------------------------答:关注.....--------------------------------------------------------------------------------答:发送和接收成功后返回,失败后也会立即返回的,例如在通讯断开的情况下,所以你应该检测发送和接收操作是否成功,如果不成功则中断操作,再者,你一次发送10k,不一定能一次发送出去,所以也因该检测实际的发送数,接收也是如此:例如intrc1,nSend;do{dwRead=sourceFile.Read(sendBuf,10240);nSend=0;do{rc=send(sockConn,sendBufnSend,dwRead,0);nSend=rc;}while(rc!=SOCKET_ERROR&&nSend0)//m_FileLength为接收文件的长度{FileByte=recv(FileSock.sockClient,recvBuf,sizeof(recvBuf),0);if(FileByte==SOCKET_ERROR)//接收错误break;destFile.Write(recvBuf,FileByte);//这儿应该是实际接收的长度m_FileLength-=FileByte;}--------------------------------------------------------------------------------答:谢谢zottff()()信誉:100。。你提到的这些我还真没有考虑到,我改改再试试看能不能成功!--------------------------------------------------------------------------------答:现在,程序运行时,接收端不停的接收数据,就算我把发送端的send函数屏蔽掉,它同样也在不停的接收数据,而接收到的数据都是乱码。发送端也一样,不停的往外发送数据,就算我把客户的recv函数屏蔽掉,那也同样不停的发送数据。也不知道到里是不是发送到客户端去了。按道理,基于TCP的SOCKED编程应该是在阻塞下执行的,也就是服务器端的send函数要把数据发送成功才进行返回,可是这里也没有看到这种情况!希望高手们帮忙看看,到里程序错在那里,我查了半天也没有找出问题来。____________________________________________________________________根据你说的现在象,有可能是你服务器的侦听SOCKET有问题,你断点调试一下,看看在SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);这里有没有阻塞住--------------------------------------------------------------------------------答:zottff()//------------------intrc1,nSend;do{dwRead=sourceFile.Read(sendBuf,10240);nSend=0;do{rc=send(sockConn,sendBufnSend,dwRead,0);nSend=rc;}while(rc!=SOCKET_ERROR&&nSend0);--------------------------------------------------------------------------------答:呵,我刚正看出了后面那个While语句了。send(sockConn,sendBufnSend,dwRead,0);该函数对第二个参数书上是这样说的:将要被传送的数据。难道这个被传送的数据不是在这一次send中完成的吗?而dwRead这是指第二个参数中的数据长度!还有这个send的返回值,它是不是返回实际发送的字节数呢?再问一下:sendBufnSend这个表示是不是指针后移呢?还有,我对这个while(rc!=SOCKET_ERROR&&nSend
  • socket收发
  • socket收发数据
  • Socket收发数据
  • Socket收发数据
  • SOCKET收发数据报
  • SOCKET收发数据问题
  • Socket收发文件
  • socket收发简单示例
  • Socket收发数据浅析
  • socket收发数据
  • Silverlight Socket 实现收发信息
  • Silverlight Socket 实现收发信息
  • java收发邮件之socket
  • 简单socket 文件收发(tcp)
  • Silverlight Socket 实现收发信息
  • Silverlight Socket 实现收发信息
  • linux socket编程收发示例
  • 异步收发数据socket实战
  • 为什么没有积分呢
  • C/C++头文件一览
  • sad
  • 入门DP pku 1163 The Triangle
  • 关于socket判断连接断开并重连
  • socket收发
  • 科研上的成就使傅妙兴获得很多荣誉
  • Linux Makefile
  • SQL 循环插入多条数据
  • SQL SERVER 事务日志文件不停增长解决
  • SQL锁表
  • 动态改变控件大小
  • rtti的typeid与danamic_cast用法
  • 一点工作经验
  • 原创粉丝点击