基于windows的I/O复用

基于windows的I/O复用_第1张图片

I/O复用技术主要就是select函数的使用。

                                          基于windows的I/O复用_第2张图片

使用select函数可以同时监视多个文件描述符。当然,监视文件描述符可以视为监视套接字。此时首先需要将要监视的文件描述符集中到一起。集中时也要按照监视项(接收、传输、异常)进行区分,即按照上述3种监视项分成3类。

  使用fd_set数组变量执行此项操作,如图。该数组时存有0和1的位数组。(liux的是维数组,windows的是句柄数组,这并没有影响,用法和下面宏的用法都是一样的,前面说的linux文件描述符脑海中自动替换成套接字句柄即可)。

                                            基于windows的I/O复用_第3张图片

如果该位置位1,则表示该文件描述符时监视对象。


在fd_set变量中注册或更改值得操作都由下列宏完成:

基于windows的I/O复用_第4张图片

                                  基于windows的I/O复用_第5张图片

              基于windows的I/O复用_第6张图片

          基于windows的I/O复用_第7张图片

                 基于windows的I/O复用_第8张图片

             基于windows的I/O复用_第9张图片

代码:

客户端

#include
#include
#pragma comment(lib,"ws2_32.lib")
#define bufsize 1024
using namespace std;
void main() {
	WSADATA wsadata;
	SOCKET clientSocket;
	SOCKADDR_IN  serverAddr;
	int  recvCnt;

	char message[bufsize] = "\0";
	if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
		cout << "WSAStartup() error" << endl;

	if ((clientSocket = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
		cout << "socket()  error" << endl;

	serverAddr.sin_family = AF_INET;
	serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serverAddr.sin_port = htons(9999);

	if(connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr))==SOCKET_ERROR)
		cout<<"connect() error"<> message;
		if (!strcmp(message, "Q") || !strcmp(message, "q")) break;
		send(clientSocket, message, strlen(message), 0);
		memset(message, 0, sizeof(message));
		recv(clientSocket, message, bufsize, 0);
		cout << "服务器结果:" << message << endl;
	}
	closesocket(clientSocket);
	WSACleanup();
}


服务器端

#include
#include
#pragma comment(lib,"ws2_32.lib")
#define bufsize 1024
using namespace std;
void main() {
	WSADATA wsadata;
	SOCKET serverSocket,clientSocket;
	int szClientAddr,fdnum,str_len;
	SOCKADDR_IN  serverAddr, clientAddr;
	fd_set reads, cpyReads;
	TIMEVAL timeout;
	char message[bufsize] = "\0";

	if(WSAStartup(MAKEWORD(2, 2), &wsadata)!=0)
		cout<<"WSAStartup() error"<










你可能感兴趣的:(TCP/IP网络编程)