打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
select模型服务器端和客户端代码

         使用VC6.0编译。为了测试方便,服务器端只接收一次数据,当客户端关闭后,服务器端也随之关闭。

服务器端代码:

#include "../common/InitSock.h"
#include <stdio.h>

CInitSock theSock;       //加载套接字库

int main()
{
USHORT nPort = 4567;    //此服务器监听的端口号
//创建监听套接字
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(nPort);
sin.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//绑定套接字到本地机器
if(bind(sListen, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("Failed bind()\n");
return -1;
}
//监听套接字
listen(sListen, 5);

//select模型处理过程
//1)初始化一个套接字集合fdSocket,添加监听套接字句柄到这个集合
fd_set fdSocket;     //所有可用套接字集合
FD_ZERO(&fdSocket);
FD_SET(sListen, &fdSocket);
bool bFlag = FALSE;   //如果bFlag为真,则结束程序

while(TRUE)
{
//2)将fdSOcket集合的一个拷贝fdRead传递给select函数,当有事件发生时,
//select函数移除集合中没有未I/O操作的套接字句柄,然后返回。
fd_set fdRead = fdSocket;
int nRet = select(0, &fdRead, NULL, NULL, NULL);
if(nRet > 0)
{
//3)通过将原来fdSOcket集合与select处理过的FdRead集合比较,
//确定都有哪些套接字有未决I/O,并进一步处理这些I/O。
for(int i = 0; i < (int)fdSocket.fd_count; i++)
{
if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
{
if(fdSocket.fd_array[i] == sListen)  //(1)监听套接字收到新连接
{
if(fdSocket.fd_count < FD_SETSIZE)
{
sockaddr_in addrRemote;
int nAddrLen = sizeof(addrRemote);
SOCKET sNew = accept(fdSocket.fd_array[i], (SOCKADDR *)&addrRemote, &nAddrLen);
FD_SET(sNew, &fdSocket);
printf("接收到连接:(%s)\n", inet_ntoa(addrRemote.sin_addr));
}
else
{
printf("Too many connections!\n");
continue;
}
}
else
{
char szText[256];
int nRecv =recv(fdSocket.fd_array[i], szText, 256, 0);  
if(nRecv > 0)     //(2)可读
{
szText[nRecv] = 0;
printf("接收到数据:%s\n", szText);
}
else        //(3)连接关闭、重启或者中断
{
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
bFlag = TRUE;
}
}
}
}
}
else
{
printf("Failed select()\n");
break;
}
if(bFlag)
break;
}
   //关闭监听套接字
closesocket(sListen);
return 0;
}
客户端代码:

#include "../common/InitSock.h"
#include <stdio.h>

CInitSock theSock;

int main()
{
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sClient == INVALID_SOCKET)
{
printf("Failed socket()\n");
return -1;
}
    //要连接的服务器地址
sockaddr_in addrRemote;
addrRemote.sin_family = AF_INET;
addrRemote.sin_port = htons(4567);
addrRemote.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

if(connect(sClient, (sockaddr *)&addrRemote, sizeof(addrRemote)) == SOCKET_ERROR)
{
printf("Failed connect()\n");
return 0;
}
//发送数据
char buf[] = "Select client demo";
send(sClient, buf, strlen(buf), 0);

Sleep(6);
//关闭套接字
closesocket(sClient);
return 0;
}


initsock.h文件代码如下:

#include <winsock2.h>
#pragma comment(lib, "WS2_32")

class CInitSock
{
public:
CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
{
//初始化WS2_32.dll
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if(WSAStartup(sockVersion, &wsaData) != 0)
{
exit(0);
}
}
~CInitSock()
{
WSACleanup();
}
};

参考:Windows网络与通信程序设计 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Select模型 详解
Socket的select模型
Select I/O模型来实现一个并发处理多个客户端的TCP服务器
Windows下C语言的Socket编程例子(TCP和UDP)
socket编程模型
Socket通信(TCP)非阻塞模式-select模型 — Windows Live
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服