select模型Client——》Server

//////////////////////////////////////////////////////
// select.cpp文件

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib

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();
}
};
CInitSock initSock; // 初始化Winsock库
int main1();
int main2();
void main()
{
printf("Please select a item:/n");
printf("s:Server/n");
printf("c:Client/n");
char a;
while(1){
scanf("%c",&a);
if(a=='s'){main1();break;}
else if(a=='c'){main2();break;}
else continue;
}
}
int main1()
{
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 = 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);
while(TRUE)
{
// 2)将fdSocket集合的一个拷贝fdRead传递给select函数,
// 当有事件发生时,select函数移除fdRead集合中没有未决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(sListen, (SOCKADDR*)&addrRemote, &nAddrLen);
FD_SET(sNew, &fdSocket);
printf("接收到连接(%s)/n", ::inet_ntoa(addrRemote.sin_addr));
}
else
{
printf(" Too much connections! /n");
continue;
}
}
else
{
char szText[256];
char temp;
int nRecv = ::recv(fdSocket.fd_array[i], szText, strlen(szText), 0);
printf("接收数据缓冲区长度:%d /n",strlen(szText));
printf("接收到数据长度:%d /n",nRecv);
if(nRecv > 0) // (2)可读
{
temp=szText[nRecv];
szText[nRecv] = '/0';
printf("接收到数据:%s /n", szText);
szText[nRecv]=temp;
}
else // (3)连接关闭、重启或者中断
{
::closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
}
}
}
}
}
else
{
printf(" Failed select() /n");
break;
}
}
return 0;
}
//Client
int main2()
{
// 创建套节字
SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET)
{
printf(" Failed socket() /n");
return 0;
}

// 也可以在这里调用bind函数绑定一个本地地址
// 否则系统将会自动安排

// 填写远程地址信息
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(4567);
// 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址
// 如果你的计算机没有联网,直接使用127.0.0.1即可
servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
{
printf(" Failed connect() /n");
return 0;
}

char szText[256];
while(TRUE){
scanf("%s",szText);
//puts(szText);
// 向服务器端发送数据
::send(s, szText, strlen(szText), 0);
}
// 关闭套节字
::closesocket(s);

return 0;
}

时间: 2024-10-13 03:21:25

select模型Client——》Server的相关文章

WSAEventSelect事件Select模型Client——》Server

////////////////////////////////////////////////// // WSAEventSelect文件 #include <winsock2.h> #pragma comment(lib, "WS2_32") class CInitSock { public: CInitSock(); ~CInitSock(); }; inline CInitSock::CInitSock() { // 初始化WS2_32.dll WSADATA ws

EventSelect套接字链表对象和线程链表对象组合下的事件Select模型

WSAEventSelect模型的是事件句柄数组和套节字句柄数组的方式去实现事件Select模型的 接下来用的是套接字链表对象和线程链表对象组合下的事件Select模型   ///////////////////////////////////////////////////// // EventSelect.h文件 DWORD WINAPI ServerThread(LPVOID lpParam); // 套节字对象 typedef struct _SOCKET_OBJ { SOCKET s;

Java 在Client/Server 网络中的应用 (转)

client|server|网络 Java 在Client/Server 网络中的应用 (作者: 2000年08月09日 10:19) 随着Java语言的日益流行,特别是Java与Internet Web的密切结合,使它在全球取得了巨大的成功.Java语言以其独立于平台.面向对象.分布式.多线索及完善的安全机制等特色,成为现代信息系统建设中的良好的开发平台和运行环境. 一.Java网络应用模型 和Internet上的许多环境一样,完整的Java应用环境实际上也是一个客户机/服务器环境,更确切地说

用vfp与sql server构建Client/Server应用程序(SPT)(1)

一些题外话 最近有一种好的现象--越来越多的Visual FoxPro用户开始注意到Client/Server应用程序的重要性,他们开始安装SQL Server了.作为开发人员,我们没有必要深入认识SQL Server的种种(我个人以为那是数据库管理员-DBA的事情),我们要解决的是怎样使Visual FoxPro与SQL Server在一起顺利的运行,怎样发挥两者的优越特性. "远程视图"一章已经涉及到了许多深层次的问题,但遗憾的是(可能是文章太过枯燥)很少有人关注它!笔者到现在还是

用vfp与sql server构建Client/Server应用程序(远程视图)(4)

缓冲(Buffering) Visual FoxPro 中的缓冲技术 当远端数据下载到客户端时,这些数据就被压入缓冲之中.在客户端用户对数据的各种移动并不反映到数据源,而是在用户确认对数据的变动后,才把各种变动以SQL描述的形式发送到后端.那么为什么不让Visual FoxPro直接一步一动的操控远程数据,就像在不使用缓冲技术控制Visual FoxPro本地数据那样.我想原因在于: 在 Client/Server 构架的应用中,数据库服务器需要同时处理许多客户的请求,如果有一个客户"直接&qu

用vfp与sql server构建Client/Server应用程序(远程视图)(2)

通过工具建立连接 以上我们都是通过命令的方式建立连接,现在我们将使用Visual FoxPro提供的连接设计器建立连接.上文我们讲到:连接对象分为两类:"基于 DSN 的连接对象"和"基于字符串的连接对象".图5: 在连接设计器中选择"数据源.用户标识.密码"就说明在建立"基于 DSN 的连接对象",在"数据源"列表框中可选择当前可用的用户型.系统型 DSN. 在连接设计器中选择"连接串"

用vfp与sql server构建Client/Server应用程序(远程视图)(1)

本文是<用 Visual FoxPro 与 SQL Server 构建 Client/Server 应用程序>系列的一部分,照例"远程视图"应不是开篇章节,但我们发现:在我们为网站准备的文章中有太多的理论性的东西,为了缓解这一矛盾,我们决定把"远程视图"提上来先写. 当下最流行的 ADO 脱胎于 Visual FoxPro,在实际使用中两者各有特色,所以不要小看 Visual FoxPro 在远程数据处理上的能力,它绝对强大!读者可以参看本站的<M

Oracle基于Client/Server的性能调整

摘要:通过探讨和研究Oracle服务器和Client/Server的特点和原理,阐述了提高.调整Oracle应用系 统性能的一些原则和方法. 关键词:Oracle:客户/服务器:系统全程区:网络I/O:回滚段. Oracle 数据库广泛应用在社会的各个领域,特别是在Client/Server模式的应用,但是应用开发者往 往碰到整个系统的性能随着数据量的增大显著下降的问题,为了解决这个问题,从以下几个方面:数据库 服务器.网络I/O.应用程序等对整个系统加以调整,充分发挥Oracle的效能,提高整

Browser/Server与Client/Server模式优缺点对比

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   browser/server具有分布性特点,可以随时随地进行业务处理.业务扩展简单方便,通过增加网页即可增加服务器功能.维护简单方便,只需要改变网页,即可实现所有用户的同步更新.开发简单,共享性强. 个性化特点明显降低,无法实现具有个性化的设计要求.操作的习惯性是以鼠标为最基本的操作方式,无法满足快速操作的要求.页面动态刷新,响应速度明显降低.专用性打印输出难以