首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求大神帮小弟我解析一上这个程序(MFC)红色地方小弟我看不懂

2013-03-01 
求大神帮我解析一下这个程序(MFC)红色地方我看不懂//全局变量SOCKET sock,msgsock[50],clisockint addlen

求大神帮我解析一下这个程序(MFC)红色地方我看不懂
//全局变量
SOCKET sock,msgsock[50],clisock;
int addlen;
sockaddr_in serv;
int count;
int getcount();
void sendtoall(SOCKET,char*);
//初始化对话框
BOOL CCSocketDlg::OnInitDialog()
{

count=0;
m_list.InsertColumn(0,"消息");
m_list.SetColumnWidth(0,435);
m_edit.SetLimitText(99);
for (int i=0;i<50;i++)
msgsock[i]=NULL;

//设定地址
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=5000;//htons(5000);
addlen=sizeof(serv);
m_button.EnableWindow(FALSE);
//创建socket
sock=socket(AF_INET,SOCK_STREAM,0);
//绑定
if (bind(sock,(sockaddr*)&serv,addlen))
{
m_edit.SetWindowText("绑定错误");
}else
{
//m_list.InsertItem(count++,inet_ntoa(serv.sin_addr));
m_edit.SetWindowText("服务器创建成功");
//开始侦听
listen(sock,5);//这个地方是一直在监听吗
//调用线程
AfxBeginThread(&thread,0);

}


return TRUE;  // return TRUE  unless you set the focus to a control
}
//服务器线程
UINT thread(LPVOID p)
{
char buff[100];
CSize size;
size.cx=0;
size.cy=30;
int s=1,msgcount,loop=1,flag=0;
CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
//获得客户端数量
msgcount=dlg->getcount();
if (msgcount==-1)
loop=0;
if(loop!=0)
{
s=1;
dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));
if (dlg->msgsock[msgcount]==INVALID_SOCKET)
{
dlg->m_edit.SetWindowText("Error accept");
}
else
{
//启动线程
AfxBeginThread(thread,0);//这里为什么还要启动一次线程
dlg->SetForegroundWindow();
dlg->m_list.InsertItem(dlg->count++,"连接成功");
dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));
dlg->m_list.Scroll(size);
dlg->m_button.EnableWindow(TRUE);
while(s!=SOCKET_ERROR)
{
//循环接收数据
s=recv(dlg->msgsock[msgcount],buff,100,0);
dlg->SetForegroundWindow();
if (s!=SOCKET_ERROR)
{
dlg->m_list.InsertItem(dlg->count++,buff);
dlg->m_list.Scroll(size);
dlg->sendtoall(dlg->msgsock[msgcount],buff);
}
}

send(dlg->msgsock[msgcount],"Disconnected",100,0);
dlg->m_list.InsertItem(dlg->count++,"Disconnected");
dlg->m_list.Scroll(size);
dlg->msgsock[msgcount]=NULL;
for (int i=0;i<50;i++)
if (dlg->msgsock[i]!=NULL)
flag=1;
if (flag!=1)
dlg->m_button.EnableWindow(FALSE);
closesocket(dlg->msgsock[msgcount]);

}
}
//终止线程
AfxEndThread(0);
return 0;
}


//发送数据
void CCSocketDlg::OnButton1() 
{
char buff[100];
m_edit.GetWindowText(buff,99);
m_edit.SetWindowText("");
m_list.InsertItem(count++,buff);
CSize size;
size.cx=0;
size.cy=30;
m_list.Scroll(size);
//循环向所有客户发送信息
for (int i=0;i<50;i++)
{
if (msgsock[i]!=NULL)
send(msgsock[i],buff,100,0);
}
}


CCSocketDlg::~CCSocketDlg()
{
for (int i=0;i<50;i++)
if (msgsock[i]!=NULL)
send(msgsock[i],"Disconnected",100,0);
}

//获得还没有使用的socket数组号
int CCSocketDlg::getcount()
{
for (int i=0;i<50;i++)


{
if (msgsock[i]==NULL)//这里怎么取没使用的SOCKET
return i;
}
return -1;

}
socket mfc 服务器
[解决办法]
是的,server socket ,调用listen一次就OK了,然后你就一个一个accept就OK了。
[解决办法]
socket的select模型,默认是阻塞的,一个线程就憋死了。

最好一个红字部分,不理解。。。是不是弄错了?
[解决办法]

引用:
引用:socket的select模型,默认是阻塞的,一个线程就憋死了。

最好一个红字部分,不理解。。。是不是弄错了?谢谢啊, 不过最后一个我也不知道怎么理解,反正程序是正确的


//获得还没有使用的socket数组号
不是都告诉你了吗 获取还没有使用的socket号
如果socket使用了 对用的msgsock[i]就不会是NULL,就会被socket()赋值了
反之则是没有用的socket  那个getcount的返回值就是对应的msgsock的索引

[解决办法]
1:listen 函数顾名思义是监听用的,当然一直在监听了
2:线程池,你启动的是另一个线程
3:msgsock[]数组保存了很多监听来的待处理的连接,没有数据的就是NULL了。
 鄙视答非所问的

热点排行