采用tcp/ip服务器断开后,客户端不断开,接收数据为空咋办? 本帖最后由 bcc222 于 2010-11-11 09:20:46 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int CSocketBlockClient::ReceiveMsg_C(char *buff){char tmp[1024];//没必要使用清1024个0浪费CPUint ret=recv(m_hSocket,tmp,1024,0);//问题处//if(ret==SOCKET_ERROR)//不是这么判断的if (ret <= 0){closesocket(m_hSocket);return ret;}}memcpy(buff,tmp,ret);tmp[ret] = 0;//结束符,别忘记了,对于传文本的时候有用.return ret;//实际收取的字符数.} // select mode #define SELECT_MODE_READY 0x001#define SELECT_MODE_WRITE 0x002// select return codes #define SELECT_STATE_READY 0#define SELECT_STATE_ERROR 1#define SELECT_STATE_ABORTED 2#define SELECT_STATE_TIMEOUT 3#ifdef WIN32 #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #pragma warning(disable:4786) #pragma warning(disable:4996) #define SocketLen int#else //network #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netinet/tcp.h> #include <netdb.h>#endifint CMySocket::BlockReceive(SOCKET sock, LPCSTR pBuffer, int readSize, int nTimeOut){ int selectState; int recvSize; selectState = Select(sock, SELECT_MODE_READY, nTimeOut); if (SELECT_STATE_TIMEOUT == selectState) return 0; if (SELECT_STATE_READY == selectState) { recvSize = recv(sock, (char*)pBuffer, readSize, 0); if (recvSize <= 0) return -1; return recvSize; } return -1;}int CMySocket::BlockSend(SOCKET sock, LPCSTR pBuffer, int writeSize, int nTimeOut){ int selectState = 0; int sendSize = 0; selectState = Select(sock, SELECT_MODE_WRITE, nTimeOut); if (selectState == SELECT_STATE_TIMEOUT) return 0; if (selectState == SELECT_STATE_READY) { sendSize = send(sock, (char*)pBuffer, writeSize, 0); if (sendSize <= 0) return -1; return sendSize; } return -1;} 链接出错 未解决 希望大家帮忙看看 VC人气不旺,都搞什么了?难道都不用了吗? 调用ORACLE存储过程的时候,能不能简单的使用“execute up_NDr2_SaveRecord @Computer =aaa,@DevID=bbb” 我想用MFC的TREE控件实现资源浏览器,请给一点提示! 我想写一个softice类的调试软件,好难呀! DNA设计的书 问题:未定义入口点 求助大神 简单的代码注入 如何往组合框Combobox填充一个文件夹的内容?又如何选择? 请教大虾:Ado中如何得到数据库表的名字? 求助:自定义控件NM_DBCLK word控件的问题
{
char tmp[1024];//没必要使用清1024个0浪费CPU
int ret=recv(m_hSocket,tmp,1024,0);//问题处
//if(ret==SOCKET_ERROR)//不是这么判断的
if (ret <= 0)
{
closesocket(m_hSocket);
return ret;
}}memcpy(buff,tmp,ret);
tmp[ret] = 0;//结束符,别忘记了,对于传文本的时候有用.
return ret;//实际收取的字符数.
}
#define SELECT_MODE_READY 0x001
#define SELECT_MODE_WRITE 0x002// select return codes
#define SELECT_STATE_READY 0
#define SELECT_STATE_ERROR 1
#define SELECT_STATE_ABORTED 2
#define SELECT_STATE_TIMEOUT 3#ifdef WIN32
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4786)
#pragma warning(disable:4996)
#define SocketLen int
#else
//network
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>
#include <netdb.h>
#endif
int CMySocket::BlockReceive(SOCKET sock, LPCSTR pBuffer, int readSize, int nTimeOut)
{
int selectState;
int recvSize;
selectState = Select(sock, SELECT_MODE_READY, nTimeOut);
if (SELECT_STATE_TIMEOUT == selectState)
return 0;
if (SELECT_STATE_READY == selectState)
{
recvSize = recv(sock, (char*)pBuffer, readSize, 0);
if (recvSize <= 0)
return -1;
return recvSize;
}
return -1;
}
int CMySocket::BlockSend(SOCKET sock, LPCSTR pBuffer, int writeSize, int nTimeOut)
{
int selectState = 0;
int sendSize = 0;
selectState = Select(sock, SELECT_MODE_WRITE, nTimeOut);
if (selectState == SELECT_STATE_TIMEOUT)
return 0;
if (selectState == SELECT_STATE_READY)
{
sendSize = send(sock, (char*)pBuffer, writeSize, 0);
if (sendSize <= 0)
return -1;
return sendSize;
}
return -1;
}