Socket 编程,recv接收数据时,如何判断有数据???

CometXi 2002-09-04 05:24:13
我在做SOCKET编程时,用的是socket,在线程中接收数据,用的是recv函数,如果服务端没有给客户端发送数据,程序就停在recv处,如何在recv前判断是否有数据???
...全文
471 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mryinliang 2002-09-04
  • 打赏
  • 举报
回复
可以用select函数检查
czy412 2002-09-04
  • 打赏
  • 举报
回复
同意楼上!
everandforever 2002-09-04
  • 打赏
  • 举报
回复
应该用消息驱动的啊,有数据来了,系统通知,然后去收。
liuyup 2002-09-04
  • 打赏
  • 举报
回复
gz
xiaotian2000 2002-09-04
  • 打赏
  • 举报
回复
1.const int WM_SERVER_ACCEPT = WM_USER+101;
const int WM_CLIENT_CLOSE = WM_USER+102;
const int WM_CLIENT_READ = WM_USER+103;
const int WM_CLIENT_READCLOSE=WM_USER+105;
2.LRESULT CServerDlg::OnServerAccept(WPARAM wParam, LPARAM lParam)
{
int iErrorCode;
int nLength = sizeof(SOCKADDR);
int i;
iErrorCode=0;
SOCKADDR_IN sockAddr;
sockAddr.sin_family=AF_INET;
sockAddr.sin_port=htons(5000);
sockAddr.sin_addr.S_un.S_addr=INADDR_ANY;

if (WSAGETSELECTERROR(lParam))
{
m_staticmsg.SetWindowText("Error detected on entry into OnServerAccept.");
return 0L;
}

if (WSAGETSELECTEVENT(lParam) == FD_ACCEPT)
{

for(i=0;(i<MAXClient)&&(m_aClientSocket[i]!=INVALID_SOCKET);i++);
if(i==MAXClient)
{
m_staticmsg.SetWindowText("not empty m_ClientSock!\n");
return 0L;//not empty m_ClientSock;
}

m_staticmsg.SetWindowText("One Client is Connecting!\n");
m_aClientSocket[i] = accept(m_hSocket, (LPSOCKADDR)&sockAddr, (LPINT)&nLength);

if (m_aClientSocket[i] == INVALID_SOCKET)
{
m_staticmsg.SetWindowText("Server socket failed to accept connection.");
return 0L;
}

CString csDottedDecimal = "ONE CLIENT CONNECTED to ";
csDottedDecimal += inet_ntoa(sockAddr.sin_addr);
// m_pDoc->SetTitle(csDottedDecimal);
csDottedDecimal += "\n";
m_staticmsg.SetWindowText("==>>"+csDottedDecimal);

WSAAsyncSelect(m_aClientSocket[i],m_hWnd,WM_CLIENT_READCLOSE,FD_READ|FD_CLOSE);

CString csText = "Connected to Server";
LPSTR lpszResponse = csText.GetBuffer(1000);

// iErrorCode = send( m_aClientSocket[i], lpszResponse, lstrlen(lpszResponse), NO_FLAGS);
if (iErrorCode == SOCKET_ERROR)
m_staticmsg.SetWindowText("Error sending response to client.");
//else
// PrintString("Response sent!\n");
//OnClientClose();
}
return 0L;
}

3.LRESULT CServerDlg::OnSocketRead(WPARAM wParam, LPARAM lParam)
{
int iBytesRead;
int iBufferLength;
int iEnd;
int iSpaceRemaining;
char chIncomingDataBuffer[1024];
CString str;
int i;

for(i=0;(i<MAXClient)&&(m_aClientSocket[i]!=wParam);i++)
{
}
if(i==MAXClient) return 0L;

iBufferLength = iSpaceRemaining = sizeof(chIncomingDataBuffer);
iEnd = 0;
iSpaceRemaining -= iEnd;

iBytesRead = recv(m_aClientSocket[i], (LPSTR)(chIncomingDataBuffer+iEnd), iSpaceRemaining, 0);

iEnd+=iBytesRead;

if (iBytesRead == SOCKET_ERROR)
m_staticmsg.SetWindowText("OnClientRead recv reported a socket error. ");

chIncomingDataBuffer[iEnd] = '\0';

if (lstrlen(chIncomingDataBuffer) != 0)
{
m_recevmsg[i]=chIncomingDataBuffer;
//分析收到包,如果格式不对,错包数加1
//if (chIncomingDataBuffer[1]!="1")
// m_erropage[i]++;
//********
}
m_recevpage[i]++;
return(0L);
}

需要更全的代码请和我联系!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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