经过测试,socket的recv执行后,好似系统的缓冲区没有被及时清除,要等一会儿才会清除,各位是怎么自动清除里面的内容的(非自己定义的接收buffer),不知道怎么办,最好有源码
解决方案 »
- 界面画线有闪烁,如何解决??
- 如何在 txt 文件插入一行字串
- Windows对按钮“应用”有默认的ID吗?如何响应呢?
- 请问有这种软件吗??
- 请教:服务器等待各个客户机的UDP消息该如何设计?
- socket数据接收问题。
- 如何使视图最大化?
- 如何将自己定义的函数里的CString加到CListBox里.在线等.
- 请教哪位知道如何使单文档程序启动后不产生文档和视图对象?仅一个Frame窗口和菜单!给cmd.mnShellCommand附值仅适用MDI.
- 4K内存处理16K文本,怎么办?
- ISAPI Filter里,有什么方法可以获取当前Filter DLL的文件路径?
- 请问 怎么才能知道现在的Windows PE是不是从EFI启动的
是否每次recv之前,都需要检测一下socket的状态??
收到乱码??使用的TCP么?我想你没有明白TCP为什么叫流式协议。你需要自己拆包的。
我在接受的时候,先读取包头,即取得包的长度,然后根据这个长度再读取多少字节的包,现在发现
有时候读取包头的时候,得到的长度不合理,都好几G了,我怀疑是里面有问题,但不知道问题出在哪里
不知道怎么样去检测现在的socket是否可用?恳请指点一下
int CHttpSocket::GetDataLength()
{
if(!m_bConnected)
return 0;
int nTotal = 0; char pDataFirst4[10]; memset(pDataFirst4, 0, sizeof(pDataFirst4)); int nRecLength = 0; struct timeval stWait;
fd_set stFdSet;
int lRet;
stWait.tv_sec = 1;
stWait.tv_usec = 0; FD_ZERO(&stFdSet);
FD_SET(m_s, &stFdSet);
lRet = select(FD_SETSIZE, &stFdSet, NULL, NULL, &stWait);
switch(lRet)
{
case -1:
return 0;
break;
case 0:
return 0;
break;
default:
if(FD_ISSET(m_s, &stFdSet))
{
nRecLength = recv(m_s, pDataFirst4, 4, 0); nTotal = pDataFirst4[0] + (pDataFirst4[1] << 8) + (pDataFirst4[2] << 16) + (pDataFirst4[3] << 24);
}
break;
}
return nTotal;}
BOOL CHttpSocket::Socket()
{
if(m_bConnected)
return FALSE; struct protoent *ppe;
WORD wVersionRequested = MAKEWORD( 2, 2 );
WSADATA wsaData; wVersionRequested = MAKEWORD( 2, 2 ); if ( WSAStartup( wVersionRequested, &wsaData ) != 0 )
{
closesocket ( m_s ) ;
WSACleanup () ;
MessageBox(NULL, "socket()函数执行失败!", "错误", MB_OK);
return FALSE ;
}
ppe=getprotobyname("TCP");//getprotobynumber(6);// ///创建SOCKET对象
m_s=socket(PF_INET,SOCK_STREAM, ppe->p_proto); BOOL bKeepAlive = TRUE; int nRet;
int nRecvBuf = 16*1024;//设置为16k
nRet = setsockopt(m_s, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int));
if (nRet !=0)
{
return FALSE;
}
if(m_s==INVALID_SOCKET)
{
MessageBox(NULL, "socket()函数执行失败!", "错误", MB_OK);
return FALSE;
}
return TRUE;}
应该是pDataFirst4[0]+ (pDataFirst4[1] *10) + (pDataFirst4[2] *100) + (pDataFirst4[3] *1000);这样吧
这里肯定有问题啦,
char本身就8位,左移8、16、24位就变成0或0xFF了看样子貌似是字节序转换
nTotal = *(int*)pDataFirst4;
nTotal = ntohl(nTotal);
我改成byte类型的,好似可以了,呵呵,再测试一下,看看如何