读书人

基于TCP数据传输send/recv函数有关问题

发布时间: 2012-01-14 20:02:35 作者: rapoo

基于TCP数据传输send/recv函数问题!
做一个基于TCP的文件传输程序:
发送端如下:
SOCKET sockConn=accept(FileSock.FileSocket,(SOCKADDR*)&addrfrom,&length);
do
{
dwRead=sourceFile.Read(sendBuf,10240);
send(sockConn,sendBuf,dwRead,0);
}
while(dwRead> 0);
closesocket(sockConn);
sourceFile.Close();

//----------
接收端如下:
char recvBuf[10240];//strlen(recvBuf)
WORD FileByte;
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);
return 0;

其中,接收端和发送端所用的套节字在一个类中做的初始化!
基初始化函数如下:
BOOL CFileSocket::InitSocket()//文件发送端
{
FileSocket=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrsock;
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);

return TRUE;
}
//---

BOOL CFileSocket::InitClientSock(CString SrvIP)//接收端
{
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
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));
return 1;
}


现在,程序运行时,接收端不停的接收数据,就算我把发送端的send函数屏蔽掉,它同样也在不停的接收数据,而接收到的数据都是乱码。
发送端也一样,不停的往外发送数据,就算我把客户的recv函数屏蔽掉,那也同样不停的发送数据。也不知道到里是不是发送到客户端去了。按道理,基于TCP的SOCKED编程应该是在阻塞下执行的,也就是服务器端的send函数要把数据发送成功才进行返回,可是这里也没有看到这种情况!
希望高手们帮忙看看,到里程序错在那里,我查了半天也没有找出问题来。



[解决办法]
发送和接收成功后返回,失败后也会立即返回的,例如在通讯断开的情况下,所以你应该检测发送和接收操作是否成功,如果不成功则中断操作,再者,你一次发送10k,不一定能一次发送出去,所以也因该检测实际的发送数,接收也是如此:例如
int rc1, nSend;
do
{
dwRead=sourceFile.Read(sendBuf,10240);
nSend = 0;
do
{
rc = send(sockConn,sendBuf+nSend,dwRead,0);
nSend += rc;
}while(rc != SOCKET_ERROR && nSend < dwRead)
if(rc == SOCKET_ERROR)//发送错误
break;
}
。。。。。
while(m_FileLength > 0)//m_FileLength为接收文件的长度
{
FileByte=recv(FileSock.sockClient,recvBuf,sizeof(recvBuf),0);
if(FileByte == SOCKET_ERROR)//接收错误
break;
destFile.Write(recvBuf,FileByte); //这儿应该是实际接收的长度
m_FileLength-=FileByte;
}

读书人网 >VC/MFC

热点推荐