scoket编程(一对多).docx
scoket编程(一对多)serverDIg.h文件IllllllllllllllllllllllllllllllllllllllllllllllllllllllinIiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiipublic:/接受到的消息CListBoxm_edMSg;/发送的消息CEditm_edSend;CStringm_strSend;/套接字SOCKETsock;/套接字数组,用来一对多SOCKETmsgsock50;/客户段套接字SOCKETclisock;/地址簇长度intm_nAddlen;/地址簇SockaddrJnserv;intm_nCount;public:/获取空闲的SOCKET数组号intgetcount();/向所有的客户端发送消息voidsendtoall(SOCKETzchar*);/Illlllllllllllllllllllllllllllllllllllllllllllllllin.cpp文件1、在server.cpp中初始化socket2、在构造函数中初始化套接字数组:for(inti=0;i<50;i+)(msgsocki=NULL;)3、在OnlnitDialOg()中创建套接字/设定地址serv.sin_addr.s_addr=htonl(INADDR_ANY);serv.sin_family=AFJNET;serv.sin_port=5000/*m_uPort*/;m_nAddlen=sizeof(serv);GetDlgItem(IDCBUTTON,SEND)->EnableWindow(FALSE);/创建SOCKETsock=socket(AFJNETzSOCK_STREAM/*SOCK_DGRAM*/,0);绑定if(bind(sockz(sockaddr*)8iservzm-nAddlen)(intnError=GetLastErrorO;m_edMSg.AddString(_T("绑定失败!");)elsem_edMSg.AddString(_T("创建服务器成功!");listen(sock,5);/创建服务器线程AfxBeginThread(8iServerThreadz0);)4、服务器线程函数/服务器线程函数UINTServerThread(LPVOID)(CStringStrText;USES_CONVERSION;charbuff100=0;CSizesize;size.c×=O;size.cy=30;intS=LmSgCOUnt,IooP=LfIag=O;/CServerDIg*dig(CServerDlg*)Af×GetMainWnd()->GetSafeHwnd();CServerDIg*dig(CServerDlg*)AfxGetApp()->GetMainWnd();if(dig=NULL)return-1;msgcount=dlg->getcount();if(msgcount=-1)loop=O;if(loop)S=1;dlg->msgsockmsgcount=accept(dlg->sockz(sockaddr*)8i(dlg->serv)x(dlg->m-nAddlen);if(dlg->msgsockmsgcount=INVALID_SOCKET)(intnError=GetLastErrorO;dlg->m_edMSg.AddString(_T("accpetfailed");)else(AfxBegiThread(ServerThreadz0);dig->SetForegroundWindowO;dlg->m_edMSg.AddString(_T(,n);dlg->m_edMSg.AddString(_T("连接!");s=recv(dlg->msgsockmsgcountzbuff100z0);StrText=inet_ntoa(dlg->serv.sin_addr);dlg->m-edMSg.AddString(*strText*A2W(buff);dlg->GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(TRUE);while(s!=SOCKET.ERROR)/循环接收数据s=recv(dlg->msgsockmsgcountzbuft100z0);dig->SetForegroundWindowO;if(s!=SOCKET_ERROR)dlg->m_edMSg.AddString(A2W(buff);dlg->sendtoall(dlg->msgsockmsgcount,buff);)send(dlg->msgsockmsgcountz"Disconnected,100z0);dig->m_edMSg.AddString(_T("Disconnected");dig->msgsockmsgcout=NULL;for(inti=0;i<50;i+)if(dlg->msgsocki!=NULL)flag=l;if(flag!=1)(dlg->GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);)closesocket(dlg->msgsockmsgcount);)终止线程AfxEndThread(O);return0;5、发送消息/获取没使用的SOCKET数组号intCServerDlg:getcount()(for(inti=0;i<50;i+)if(msgsocki=NULL)returni;)return-1;voidCServerDlg:sendtoall(SOCKETszchar*buffer)(for(inti=0;i<50;i+)(if(msgsocki=NULL&&msgsocki!=s)发送send(msgsockizbufferx100z0);)/Iiiiiiiiiiiiiiiiiiiiiiiiiiiii客户端代码ClientDld.h/Iiiiiiiiiiiiiiiiiiiiiiiiiiiiin客户端套接字SOCKETclisock;/地址簇SockaddrJncli;intm_nCount;intm_nEe;/IiiiiiiiiiiiiiiiiiiiiiiiiiiiiclientDlg.cpp/Iiiiiiiiiiiiiiiiiiiiiiiiiiiii1、在clien.cpp中初始化socketif(!AfxSocketInitO)(/AfxMessageBox(IDP_SOCKETSJNIT_FAILED);returnFALSE;)2、连接服务器voidCciientDlgzonBnciickedButtonConnetO/连接服务器UpdateDataO;USES,CONVERSION;charipaddress35;/m-edIRGetWindowText(A2W(ipaddress)z30);strcpy(ipaddresszW2A(m_strIP);cli.sin_addr.s_addr=inet_addr(ipaddress);cli.sin_family=AFJNET;cli.sin_port=m_uPort;创建socketclisock=socket(AFJNETzSOCK.STREAMzO);mnEe=1;启动线程AfxBeginThread(threadzO);)3、客户端线程函数/客户端线程UINTthread(LPVOIDv)(charbuff100;chararray2530=,1155.245.160.1511,l”155.245.160.152”,"155.245.160.153,“155.245.160.154”,”155.245.160.155”,”155.245.160.156”,”155.245.160.157”,”155.245.160.158”,155.245.160.159nz”155.245.160.160”,,155.245.160.161”155.245.160.162“,”155.245.160.163”,155.245.160.164"z”155.245.160.165”,”155.245.160.166”,n155.245.160.167n,”155.245.160.168”,155.245.160.169nz"155.245.160.1701,z,155.245.160.171”155.245.160.172”,,155.245.160.173,”155.245.160.174”,n155.245.160.175n);USES_CONVERSION;ints=lzaddcount=0;CCIientDIg*dig=(CCIientDlg*)AfxGetApp()->GetMainWndO;if(dig=NULL)return-1;dlg->GetDlgItem(IDC_BUTTON_CONNET)->EnableWindow(FALSE);dlg->GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);/连接服务器while(connect(dlg->clisockz(sockaddr*)8i(dlg->cli)xsizeof(dlg->cli)&&dlg->m_nEe