我在OnInitDialog里对SOCKET对象sClient进行了初始化,然后再通过方法ConnectServer()进行连接和发送消息,在此方法里可以正常发送和接收消息
可是我在另一个方法里就只能发送,不能接收消息,本来recv应该是阻塞的,可在另一方法里根本就不阻塞,不晓得这是什么原因,在此向各位请教
初始化方法
OnInitDialog()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
sClient = socket(AF_INET, SOCK_STREAM, 0); if ( sClient < 0 )
{
AfxMessageBox("初始化SOCKET失败!");
PostQuitMessage(0);
}
}
连接服务器方法
BOOL CClientDlg::ConnectServer(CString svIP, int svPort, CString sName)
{
memset(&ServerAddr, 0, sizeof(ServerAddr));
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(svPort);
ServerAddr.sin_addr.s_addr = inet_addr(svIP); if(connect(sClient, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)) < 0 )
{
MessageBox("连接服务器失败,请确认服务器地址和端口号!", "警告", MB_OK | MB_ICONSTOP);
return FALSE;
}

CString sMSG;
sMSG = "_LOG:"+sName;
int numsnd = send(sClient, sMSG, strlen(sMSG), 0);
if ( numsnd != strlen(sMSG) )
{
MessageBox("发送获取服务器列表出错!", "警告", MB_OK | MB_ICONSTOP);
return FALSE;
}
int len = sizeof(SROOM);
char buf[2049]; int numscv = recv(sClient, buf, len, 0);

if ((numscv == 0) || (numscv == SOCKET_ERROR))
{
MessageBox("发送获取服务器列表出错!", "警告", MB_OK | MB_ICONSTOP);
return FALSE;
}
SROOM sroom;
sroom = (SROOM&)buf;
}这里可以发送并接收下面的方法就只能发送,不能接收
void CClientDlg::OnDblclkListDesk(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
//取得当前选择行的索引值
int row = m_pDeskList.GetNextItem(-1,LVNI_SELECTED);
if (row == -1)
return; //发送入坐请求
CString sMSG;
sMSG.Format("_JOIN:%d", row);
send(sClient, sMSG, strlen(sMSG), 0);


//接受确认信息
char rcvbuf[10)];
//memset(rcvbuf,0,sizeof(rcvbuf));
int num = recv(sClient, rcvbuf, 10, 0);
         //并且如果服务器不发消息过来,也会执行下面的语句
         AfxMessageBox("结束");
}

解决方案 »

  1.   

    自己顶啊
    在线等啊, 新手初学Socket,请各位赐教
      

  2.   

    //接受确认信息
    char rcvbuf[10)];
    //memset(rcvbuf,0,sizeof(rcvbuf));
    int num = recv(sClient, rcvbuf, 10, 0);
             //并且如果服务器不发消息过来,也会执行下面的语句=====>>>>
    为什么不判断一下num 的值为多少?? 看看是否为0。。
      

  3.   

    int num = recv(sClient, rcvbuf, 10, 0);
    后面的值写多大,他就是多大
    我这里返回10,
    recv应该阻塞的,为什么我这里就不阻塞呢
    好郁闷
      

  4.   

    好,既然是10, 那么你尝试一下int num = recv(sClient, rcvbuf, 10, 0);
    int i = 0;
    while ( num > 0 )
    {
       num = recv(sClient, rcvbuf, 10, 0);
    i ++;
    if( i > 100 ) break;
    }// 查看i
      

  5.   

    sClient = socket(AF_INET, SOCK_STREAM, 0);-〉〉〉〉晕,注意这句, 最后一个参数0 表示irda, 如果是tcp
     ,设6
      

  6.   

    是不是connect和recv必须在一个方法里才阻塞?
    可以成功发送消息,应该说明已经建立连接,那就是说recv应该阻塞的, 可这里根本就不阻塞,有什么原因可以导致这样?
      

  7.   

    striking,我设置成6也是一样的
      

  8.   

    hmmmmmmmmmmmmm... 0 好像也是可以的。
    我自己也是写0,看msdn说是0表示irda。不需要在同一方法内。很奇怪。等待高手出现吧
      

  9.   

    最后一招unsigned int opt = 0;int n = ioctlsocket( sClient, FINBIO, &opt );if ( n == -1 )  //error
      

  10.   

    after connect successful , invoke
      

  11.   

    还有高手吗?
    帮我解决一下这问题,Thanks