网络编程 笔记(八) I/O复用
来源:互联网 发布:永安市招聘淘宝运营 编辑:程序博客网 时间:2024/05/16 09:43
select函数调用示例
#include <stdio.h>#include <unistd.h>#include <sys/time.h>#include <sys/select.h>#define BUF_SIZE 30int main(int argc, char *argv[]){ fd_set reads, temps; int result; long str_len; char buf[BUF_SIZE]; struct timeval timeout; FD_ZERO(&reads); FD_SET(0, &reads); while (1) { temps = reads; timeout.tv_sec = 5; timeout.tv_usec = 0; result = select(1, &temps, 0, 0, &timeout); if (result == -1) { puts("select() error"); break; } else if(result == 0){ puts("time out"); } else{ if (FD_ISSET(0, &temps)) { str_len = read(0, buf, BUF_SIZE); buf[str_len] = 0 ; printf("message from console : %s", buf); } } } return 0;}
基于Windows实现I/O复用服务器端
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <WinSock2.h>#define BUF_SIZE 1024void ErrorHandling(char *message);int main(int argc, char *argv[]){ WSADATA wsaData; SOCKET hServSock, hClntSock; SOCKADDR_IN servAdr, clntAdr; TIMEVAL timeout; fd_set reads, cpyReads; int adrSz; int strLen, fdNum, i; char buf[BUF_SIZE]; if (argc != 2) { printf("Usage : %s <port> \n", argv[0]); exit(1); } if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { ErrorHandling("WSAStartup() error!"); } hServSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (hServSock == INVALID_SOCKET) { ErrorHandling("socket() error!"); } memset(&servAdr, 0, sizeof(servAdr)); servAdr.sin_family = AF_INET; servAdr.sin_addr.s_addr = htonl(INADDR_ANY); servAdr.sin_port = htons(atoi(argv[1])); if (bind(hServSock, (SOCKADDR *) &servAdr, sizeof(servAdr)) == SOCKET_ERROR) { ErrorHandling("bind() error!"); } if (listen(hServSock, 5) == SOCKET_ERROR) { ErrorHandling("listen() error!"); } FD_ZERO(&reads); FD_SET(hServSock, &reads); while (1) { cpyReads = reads; timeout.tv_sec = 5; timeout.tv_usec = 5000; if ((fdNum = select(0, &cpyReads, 0, 0, &timeout)) == SOCKET_ERROR) { break; } if (fdNum == 0) { continue; } for (i = 0; i < reads.fd_count; i++) { if (FD_ISSET(reads.fd_array[i], &cpyReads)) { if (reads.fd_array[i] == hServSock) { adrSz = sizeof(clntAdr); hClntSock = accept(hServSock, (SOCKADDR *)&clntAdr, &adrSz); if (hClntSock == INVALID_SOCKET) { ErrorHandling("accept() error!"); } FD_SET(hClntSock, &reads); printf("connected client : %d \n", hClntSock); } else { strLen = recv(reads.fd_array[i], buf, BUF_SIZE - 1, 0); if (strLen == 0) { FD_CLR(reads.fd_array[i], &reads); closesocket(cpyReads.fd_array[i]); printf("closed client : %d \n", cpyReads.fd_array[i]); } else { send(reads.fd_array[i], buf, strLen, 0); } } } } } closesocket(hServSock); WSACleanup(); system("PAUSE"); return 0;}void ErrorHandling(char *message){ fputs(message, stderr); fputc('\n', stderr); exit(1);}
基于Linux客户端
//// main.c// echo_client//// Created by wu on 15/10/16.// Copyright (c) 2015年 template. All rights reserved.//#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/socket.h>#define BUF_SIZE 1024void error_handing(char *message);void echo_client(int argc, const char * argv[]);void test_gethostbyname();int main(int argc, const char * argv[]){ echo_client(argc, argv); return 0;}void error_handing(char *message){ fputs(message, stderr); fputc('\n', stderr); exit(1);}void echo_client(int argc, const char * argv[]){ // 套接字文件描述符号 int sock; // 接收信息的BUF char message[BUF_SIZE]; long str_len, recv_len, recv_cnt; // 套接字地址信息 struct sockaddr_in serv_adr; if (argc != 3) { printf("Usage : %s <port>\n", argv[0]); exit(1); } // 创建客户端套接字,参数含义为: // PF_INET 表示IPv4 // SOCK_STREAM 表示以流方式传输 // IPPROTO_TCP 表示使用tcp协议 sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == -1) { error_handing("socket() error"); } //组织服务器地址信息 memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr.sin_family = PF_INET; serv_adr.sin_addr.s_addr = inet_addr(argv[1]); serv_adr.sin_port = htons(atoi(argv[2])); //向服务器发起连接 if (connect(sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr))) { error_handing("connect() error"); } else { puts("Connected.........."); } while (1) { fputs("Input message(Q to quit) : ", stdout); fgets(message, BUF_SIZE, stdin); if (!strcmp(message, "q\n") || !strcmp(message, "Q\n")) { break; } str_len = write(sock, message, strlen(message)); recv_len = 0; while (recv_len < str_len) { recv_cnt = read(sock, message, BUF_SIZE-1); if (recv_cnt == -1) { error_handing("read() error"); } recv_len += recv_cnt; } message[str_len] = 0; printf("Message from server: %s", message); } close(sock);}
0 0
- 网络编程 笔记(八) I/O复用
- Linux网络编程(八) 高级I/O函数
- 【网络】(八)I/O复用--Select(二)
- 网络编程:I/O复用
- 网络编程:I/O复用
- Linux/UNIX网络编程笔记 - I/O复用
- unix编程(八)高级I/O
- 《Unix网络编程》笔记(I/O模型)
- linux网络编程之socket(八):五种I/O模型和select函数简介
- linux网络编程之socket(八):五种I/O模型和select函数简介
- linux网络编程之socket(八):五种I/O模型和select函数简介
- linux网络编程之socket(八):五种I/O模型和select函数简介
- UNIX网络编程笔记(5)—I/O复用select/poll
- 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数
- linux高性能服务器编程学习笔记八:I/O复用
- Unix网络编程:I/O复用
- Linux网络编程之I/O复用
- Java 网络编程---I/O部分学习笔记整理1
- PLSQL跳出嵌套循环的小例子
- DataGridView列长度大于30就以...形式显示
- 守护进程与僵尸进程
- Java 异常处理机制
- opencv中关于cvNorm函数的使用
- 网络编程 笔记(八) I/O复用
- maven引入json-lib报错
- iOS开发系列--地图与定位
- 结构体和枚举类型
- MFC 串口发送文件
- 字符串处理
- 像查看本地Oracle数据一样查看远程Oracle数据-----Oracle database link创建和使用
- Android中Invalidate和postInvalidate和requestLayout的区别
- poj3669 流星雨