socket接受数据问题。

taotao7805 2005-03-02 01:31:02
写个了socket通信程序,可是在接受端就是接受不到最后一次由发送端发送来的数据。发送端发两次只能接收到一次;发送端发三次只能接受到两次;如果只发送一次,就接受不到。这是为何?有没有人遇到过与我一样的问题?还希望有经验的朋友指点。
...全文
191 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
taotao7805 2005-03-03
  • 打赏
  • 举报
回复
up
aoosang 2005-03-03
  • 打赏
  • 举报
回复
Sleep(1000);将sleep的时间再加长一些,
我估计是你这端发送完了就将socket断开了,那边接收的socket处理数据慢,还没有接收完,你这边的socket就断开了,那天就肯定接收不到剩下的数据了
taotao7805 2005-03-02
  • 打赏
  • 举报
回复
估计是楼上的兄弟没有仔细看,我的代码就是在客户端而且也是用的非阻塞模式。所以你的建议。。。。。。
catyou 2005-03-02
  • 打赏
  • 举报
回复
不明白SetingSelect函数加入这一行select(0,&fdread,&fdwrite,NULL,NULL);是为什么??
一般select在client端比较多,但你既然是block的,就不需要这些了。去掉试试?
taotao7805 2005-03-02
  • 打赏
  • 举报
回复
服务器段发送一个数据过来,是不是客户端什么时候都能收到,这数据不会丢失?
taotao7805 2005-03-02
  • 打赏
  • 举报
回复
// EpgCore.cpp: implementation of the EpgCore class.
//
//////////////////////////////////////////////////////////////////////


#include "stdafx.h"
#include "EpgClient.h"
#include "EpgCore.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

EpgCore::EpgCore()
{
host = NULL;
// memset(szBuff,0,DEFAULT_BUFFER);
strcpy(szBuff,"\0");

}

EpgCore::~EpgCore()
{
closesocket(sClient);
WSACleanup();
}

int EpgCore::initialize()
{


int iPort = DEFAULT_PORT;
WSADATA wsd;
struct sockaddr_in server;
unsigned long ul =1;
struct hostent *host = NULL;
tm.tv_sec = 5;
tm.tv_usec = 0;

if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
{
AfxMessageBox("initializing socke failed");
return -1;
}
sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

if(sClient == SOCKET_ERROR)
{
AfxMessageBox("socket() failed");
return -1;
}

server.sin_family = AF_INET;
server.sin_port = htons(iPort);
server.sin_addr.s_addr = inet_addr("192.168.136.102");//ip address

if(server.sin_addr.s_addr == INADDR_NONE)
{
host = gethostbyname("192.168.136.102");
if(host == NULL)
return -1;
CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length);
}

if(connect(sClient,(struct sockaddr*)&server,sizeof(server)) == SOCKET_ERROR)
{
AfxMessageBox("connect() failed");
return -1;
}
//set noblock model
if (ioctlsocket(sClient, FIONBIO, &ul) == SOCKET_ERROR)
{
AfxMessageBox("ioctlsocket() failed");
return -1;
}
return 0;
}

void EpgCore::tick()
{

SetingSelect();
SendMessage();
RecvMessage();



}


int EpgCore::SetingSelect()
{
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_SET(sClient,&fdread);
FD_SET(sClient,&fdwrite);
select(0,&fdread,&fdwrite,NULL,NULL);
return 0;
}

int EpgCore::RecvMessage()
{
if(FD_ISSET(sClient,&fdread))
{

RecvRet = recv(sClient,szBuff,DEFAULT_BUFFER,0);
if(RecvRet == 0)
return -1;
else if (RecvRet == SOCKET_ERROR)
return -1;
szBuff[RecvRet] = '\0';
AfxMessageBox(szBuff);
if(strcmp("SIZE 551",szBuff) != 0)

FileOperate(szBuff);
}
return 0;
}


int EpgCore::SendMessage()
{
if(FD_ISSET(sClient,&fdwrite))
{
ret = send(sClient,"GETLIST",sizeof("GETLIST"),0);
if(ret == 0)
return -1;
if(ret == SOCKET_ERROR)
return -1;
Sleep(1000);
}

return 0;
}

void EpgCore::FileOperate(char *str)
{
CStdioFile file;
if(file.Open("D:\\epg.txt",CFile::modeReadWrite|CFile::typeText) == 0)
AfxMessageBox("open file failed!");
file.SeekToEnd();//从文件未开始写
file.WriteString(str);
// MessageBox(str);
file.WriteString("\n");
file.Close();

}
这是一个类,我用SendMessage()函数发送数据,可是我在另一断总是要少接受一次,也就是最后一次不能接受到。
xjtuzhw 2005-03-02
  • 打赏
  • 举报
回复
代码段贴出来
只靠说的甚么也看不出来呀
JasonHeung 2005-03-02
  • 打赏
  • 举报
回复
没有。检查你的接受函数,单步跟踪。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧