select模型Client——》Server

简介: ////////////////////////////////////////////////////// // select.cpp文件 #include #include #pragma comment(lib, "WS2_32") // 链接到WS2_32.

////////////////////////////////////////////////////// // 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; }

目录
相关文章
|
1月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
45 6
Server-Sent Events 和 WebSocket 之间有什么区别
Server-Sent Events (SSE) 和 WebSocket 分别代表单向和双向通信机制。SSE,基于 HTTP,仅允许服务器向客户端发送事件流;而 WebSocket 是双向实时通信协议,支持客户端与服务器的双向交互。SSE适合低实时性场景,依赖长轮询或流传输;WebSocket 提供更低延迟,适用于高实时性应用。两者在现代浏览器中普遍被支持,但旧版浏览器或特定网络环境可能影响兼容性。选择哪种机制取决于实际需求,如通信方向、实时性要求及目标浏览器支持。
|
6月前
swing编写client端及多线程server端之server端
swing编写client端及多线程server端之server端
|
网络协议
UDP Server/Client
UDP Server/Client
231 0
IOCP完成端口模型Client——》Server
调试时的::OutputDebugString("something!");需要用DebugView查看,可以到:http://www.onlinedown.
950 0
|
API Windows Linux
|
NoSQL 关系型数据库 Shell