#include <iostream> #include "ODSocket.h" #include <pthread h=""> #include <unistd h=""> #include <list> list<odsocket> allClient;//保存所有 的客户端socket对象 list<string> allMessage;//保存所有的要发送的聊天信息 void * GetMessage(void *ptr)//用该线程方法实现和所有人聊天 { ODSocket *nowsock=(ODSocket *)ptr; char msg[1024]; bzero(msg, sizeof(msg)); while (1) { if(NULL==nowsock||NULL==nowsock->m_sock||nowsock->m_sock<=0){ break; } nowsock->Recv(msg, sizeof(msg)); strcat(msg, "\r\n"); std::cout<<"接收信息"<<msg<<"\n"; string msgstr=msg; allMessage.push_front(msgstr); } return NULL; } void * DoSocket(void *ptr)//用该线程方法实现和所有人通讯 { std::cout<<"ppppis k"<<"\n"; while (1) { // if (allClient.size()>0) { if(allMessage.size()>0){ list<string>::iterator nowmsg; for(nowmsg=allMessage.begin();nowmsg!=allMessage.end();nowmsg++) { char msg[1024]; // strcpy(msg, *nowmsg); // std::cout<<"nowmsg"<<nowmsg->c_str()<<"\n"; list<odsocket>::iterator nowsock; for(nowsock=allClient.begin();nowsock!=allClient.end();nowsock++) { if(nowsock->m_sock<0 break="" nowsock-="">Send(nowmsg->c_str(),nowmsg->length(),0); std::cout<<"广播:"<<nowmsg->c_str()<<"\n"; } } allMessage.clear();///清空 } } sleep(1);//1秒群发一次 } return NULL; } int main(int argc, const char * argv[]) { pthread_t ids; pthread_t id;//定义线程id int i,ret; ret=pthread_create(&id,NULL,DoSocket,NULL);//创建一个线程 if(ret!=0){ printf ("Create pthread error!\n"); exit (1); } //创建Socket ODSocket sockServer; sockServer.Init(); bool res=sockServer.Create(AF_INET, SOCK_STREAM,0); std::cout<< "创建 服务器"<<(res==1?"成功":"失败")<<"\n"; //绑定端口 res=sockServer.Bind(6666); std::cout << "绑定端口 "<<(res==1?"成功":"失败")<<"\n"; //开始侦听 res=sockServer.Listen(); std::cout << "侦听端口 "<<(res==1?"成功":"失败")<<"\n"; char message[30]; //接收客户端的连结 int count=0; // sockServer.Close(); while (1) { //如果有客户端连接,创建客户端的socket ODSocket * p_sockClient=new ODSocket(); char * address=new char[40]; sockServer.Accept(*p_sockClient,address); std::cout<<address<<"来了"<<endl sprintf="" message="" welcome="" s="" address="" p_sockclient-="">Send(message, sizeof(message)); //启动线程接收数据 ret=pthread_create(&ids,NULL,GetMessage,p_sockClient);//创建一个线程 //每当有1个客户端连结上来,添加到List集合 allClient.push_back(*p_sockClient); } //输入任意字符退出 cin>>message; return 0; } </endl></nowmsg-></0></odsocket></nowmsg-></string></string></odsocket></list></unistd></pthread></iostream>