socket收发

您当前的位置:同创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&&nSend 0)//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&&nSend 0); -------------------------------------------------------------------------------- 答:呵,我刚正看出了后面那个While语句了。send(sockConn,sendBufnSend,dwRead,0);该函数对第二个参数书上是这样说的:将要被传送的数据。难道这个被传送的数据不是在这一次send中完成的吗?而dwRead这是指第二个参数中的数据长度!还有这个send的返回值,它是不是返回实际发送的字节数呢?再问一下:sendBufnSend这个表示是不是指针后移呢?还有,我对这个while(rc!=SOCKET_ERROR&&nSend
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值