我在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("结束");
}
可是我在另一个方法里就只能发送,不能接收消息,本来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("结束");
}
在线等啊, 新手初学Socket,请各位赐教
char rcvbuf[10)];
//memset(rcvbuf,0,sizeof(rcvbuf));
int num = recv(sClient, rcvbuf, 10, 0);
//并且如果服务器不发消息过来,也会执行下面的语句=====>>>>
为什么不判断一下num 的值为多少?? 看看是否为0。。
后面的值写多大,他就是多大
我这里返回10,
recv应该阻塞的,为什么我这里就不阻塞呢
好郁闷
int i = 0;
while ( num > 0 )
{
num = recv(sClient, rcvbuf, 10, 0);
i ++;
if( i > 100 ) break;
}// 查看i
,设6
可以成功发送消息,应该说明已经建立连接,那就是说recv应该阻塞的, 可这里根本就不阻塞,有什么原因可以导致这样?
我自己也是写0,看msdn说是0表示irda。不需要在同一方法内。很奇怪。等待高手出现吧
帮我解决一下这问题,Thanks