18,356
社区成员
发帖
与我相关
我的任务
分享
void CSelwinsDlg::OnCreate()
{
/***初始化winsock2.DLL***/
WSADATA wsaData;
WORD wVersionRequested=MAKEWORD(2,2); //生成版本号2.2
if(WSAStartup(wVersionRequested,&wsaData)!=0)
{
c_recvbuf.AddString("加载winsock.dll失败!\n");
}
/***创建套接字***/
if ((sock_server = socket(AF_INET,SOCK_STREAM,0))<0)
{
c_recvbuf.AddString("创建套接字失败!\n");
WSACleanup();
}
/***填写要绑定的本地地址***/
int addr_len = sizeof(struct sockaddr_in);
memset((void *)&addr,0,addr_len);
addr.sin_family =AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);//允许套接字使用本机的任何IP
/***给监听套接字绑定地址***/
if(bind(sock_server,( struct sockaddr *)&addr,sizeof(addr))!=0)
{
c_recvbuf.AddString("地址绑定失败!\n");
closesocket(sock_server);
WSACleanup();
}
/***将套接字设为监听状态****/
if(listen(sock_server,0)!=0)
{
c_recvbuf.AddString("listen函数调用失败!\n");
closesocket(sock_server);
WSACleanup();
}
else
c_recvbuf.AddString("listenning......\n");
FD_ZERO(&fdsock);//初始化fdsock
FD_SET(sock_server, &fdsock);//将监听套接字加入到套接字集合fdsock
/***循环:接收连接请求并收发数据***/
while(true)
{
FD_ZERO(&fdread);//初始化fdread
fdread=fdsock;//将fdsock中的所有套接字添加到fdread中
if(select(0, &fdread, NULL, NULL, NULL)>0)
{
for(int i=0;i<fdsock.fd_count;i++)
{
if (FD_ISSET(fdsock.fd_array[i], &fdread))
{
if(fdsock.fd_array[i]==sock_server)
{ //有客户连接请求到达,接收连接请求
newsock=accept (sock_server, (struct sockaddr *) &client_addr, &addr_len);
if(newsock==INVALID_SOCKET)
{ //accept出错终止所有通信,结束程序
c_recvbuf.AddString("accept函数调用失败!\n");
for(int j=0;j<fdsock.fd_count;j++)
closesocket(fdsock.fd_array[j]); //关闭所有套接字
WSACleanup();//注销WinSock动态链接库
}
else
{
c_recvbuf.AddString(inet_ntoa(client_addr.sin_addr));
send(newsock,msg,sizeof(msg),0) ;//发送一段信息
FD_SET(newsock, &fdsock);//将新套接字加入fdsock
}
}
else
{ //有客户发来数据,接收数据
memset((void *) msgbuffer,0, sizeof(msgbuffer));//缓冲区清零
int size=recv(fdsock.fd_array[i],msgbuffer,sizeof(msgbuffer),0);
if(size<0) //接收信息
c_recvbuf.AddString("接收信息失败!");
else if(size==0)
c_recvbuf.AddString("对方已关闭!\n");
else
{ //显示收到信息
getpeername(fdsock.fd_array[i], (struct sockaddr *)&client_addr, &addr_len); //获取对方IP地址
c_recvbuf.AddString( msgbuffer );
}
closesocket(fdsock.fd_array[i]); //关闭套接字
FD_CLR(fdsock.fd_array[i],&fdsock);//清除已关闭套接字
}
}
}
}
else
{
c_recvbuf.AddString("Select调用失败!");
break;//终止循环退出程序
}
}
}