求解,socket编程中的recv跟accpet一定要在一个类吗
求解,socket编程中的recv和accpet一定要在一个类吗?
rt,我想做一个聊天软件,有一个主界面,里面有添加的好友,都是一些ip。程序启动时就把程序当做服务器,可以接受其他客户端的连接,当连接到达时弹出聊天窗口,这样的话,recv()和accpet()就不在一个类里面,结果老是出错,请问各位高手有什么解决办法?
------解决方案--------------------
不在一个线程都可以,不在一个类里很正常呀,出错,应该是你程序某个地方写错了
------解决方案--------------------
为什么我accept之后程序就会死掉呢?下面是我的代码
------解决方案--------------------
本帖最后由 VisualEleven 于 2012-10-12 22:18:45 编辑
------解决方案--------------------
if( (res = recv(sock, msg, 1024, 0)) == -1 )
recv 是阻塞的,这样的界面线程就挂起了,当然没有响应了,
开个线程收,或使用MFC 的 异步Socket类叫CAsync什么的
------解决方案--------------------
用非阻塞IO模型或者多线程吧
------解决方案--------------------
不在一个类里是可以的
--------------
还有,你的这里:
if( (res = recv(sock, msg, 1024, 0)) == -1 )
sock有效么?
------解决方案--------------------
accept阻塞,你不会认为是死掉了吧??
------解决方案--------------------
这个我在上面声明了
rt,我想做一个聊天软件,有一个主界面,里面有添加的好友,都是一些ip。程序启动时就把程序当做服务器,可以接受其他客户端的连接,当连接到达时弹出聊天窗口,这样的话,recv()和accpet()就不在一个类里面,结果老是出错,请问各位高手有什么解决办法?
------解决方案--------------------
不在一个线程都可以,不在一个类里很正常呀,出错,应该是你程序某个地方写错了
------解决方案--------------------
为什么我accept之后程序就会死掉呢?下面是我的代码
------解决方案--------------------
本帖最后由 VisualEleven 于 2012-10-12 22:18:45 编辑
BOOL CChat::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CChat * dlg = (CChat *)AfxGetApp()->GetMainWnd();
char name[80];
CString IP;
hostent* pHost;
gethostname(name, 128);//获得主机名
pHost = gethostbyname(name);//获得主机结构
IP = inet_ntoa(*(in_addr *)pHost->h_addr);
show_edit = (CEdit *)GetDlgItem(IDC_EDIT);
update("本机IP地址:" + IP);
int res;
char msg[1024];
while(1)
{
if( (res = recv(sock, msg, 1024, 0)) == -1 )
{
dlg->update("失去连接");
break;
}
else
{
msg[res] = '\0';
dlg->update("client:" + CString(msg));
}
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
------解决方案--------------------
if( (res = recv(sock, msg, 1024, 0)) == -1 )
recv 是阻塞的,这样的界面线程就挂起了,当然没有响应了,
开个线程收,或使用MFC 的 异步Socket类叫CAsync什么的
------解决方案--------------------
用非阻塞IO模型或者多线程吧
------解决方案--------------------
不在一个类里是可以的
--------------
还有,你的这里:
if( (res = recv(sock, msg, 1024, 0)) == -1 )
sock有效么?
------解决方案--------------------
accept阻塞,你不会认为是死掉了吧??
------解决方案--------------------
这个我在上面声明了