Linux网络编程(三) IO非阻塞操作
来源:互联网 发布:p2p网络终结者破解版 编辑:程序博客网 时间:2024/05/22 01:29
IO非阻塞操作
sock的方法不一定非得是阻塞的,也可以非阻塞的操作。有两种方法分别为设置fcntl 和设置相应函数的参数。
服务端:
#include <sys/socket.h>#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <errno.h>#define BUFSIZE 128int main(int argc,char *argv[]){ int server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; int i,byte; char char_send[BUFSIZE]; server_sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&server_address, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_port = htons(7838); server_address.sin_addr.s_addr = INADDR_ANY; server_len = sizeof(server_address); if ((bind(server_sockfd, (struct sockaddr *)&server_address, server_len))== -1) { perror("bind"); exit(EXIT_FAILURE); } listen(server_sockfd, 5); printf("server waiting for connect\n"); client_len = sizeof(client_address); client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, (socklen_t *)&client_len); for(i=0;i<5;i++){ memset(char_send,'\0',BUFSIZE); printf("input message to send:"); fgets(char_send,BUFSIZE,stdin); if((byte=send(client_sockfd,char_send,strlen(char_send),0))==-1){ perror("send"); exit(EXIT_FAILURE); } memset(char_send,'\0',BUFSIZE); //最后一个参数为非阻塞的设置 byte = recv(client_sockfd, char_send, BUFSIZE,MSG_DONTWAIT); if(byte > 0){ printf("get %d message:%s", byte, char_send); byte=0; }else if(byte<0){ if(errno==EAGAIN){ errno=0; continue; }else{ perror("recv"); exit(EXIT_FAILURE); } } } shutdown(client_sockfd,2); shutdown(server_sockfd,2);}
客户端:
#include <stdio.h>#include <string.h>#include <errno.h>#include <sys/socket.h>#include <resolv.h>#include <stdlib.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <fcntl.h>#define MAXBUF 128int main(int argc, char **argv){ int sockfd, ret, i; struct sockaddr_in dest, mine; char buffer[MAXBUF + 1]; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Socket"); exit(EXIT_FAILURE); } bzero(&dest, sizeof(dest)); dest.sin_family = AF_INET; dest.sin_port = htons(7838); if(argc<2){ printf("Usage: %s <dest ip> <src ip>",argv[0]); exit(1); } if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0){ perror(argv[1]); exit(1); } bzero(&mine, sizeof(mine)); mine.sin_family = AF_INET; mine.sin_port = htons(7839); if (inet_aton(argv[2], (struct in_addr *) &mine.sin_addr.s_addr) == 0){ perror(argv[2]); exit(EXIT_FAILURE); } if (bind(sockfd, (struct sockaddr *) &mine, sizeof(struct sockaddr)) == -1){ perror(argv[3]); exit(EXIT_FAILURE); } printf("will connect!\n"); if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) { perror("Connect "); exit(EXIT_FAILURE); } //设置sock连接的非阻塞 if(fcntl(sockfd, F_SETFL, O_NONBLOCK) == -1) { perror("fcntl"); exit(EXIT_FAILURE); } while(1){ bzero(buffer, MAXBUF + 1); //因为在socket中设置过,所以就不用再设置了 ret = recv(sockfd, buffer, MAXBUF, 0); if(ret > 0){ printf("get %d message:%s", ret, buffer); ret=0; }else if(ret < 0) { if(errno == EAGAIN) { errno=0; continue; }else{ perror("recv"); exit(EXIT_FAILURE); } } memset( buffer,'\0',MAXBUF+1); printf("input message to send:"); fgets( buffer,MAXBUF,stdin); if((ret=send(sockfd,buffer,strlen(buffer),0))==-1){ perror("send"); exit(EXIT_FAILURE); } } close(sockfd); return 0;}
本篇博客出自 阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/6898577
- Linux网络编程(三) IO非阻塞操作
- Linux网络编程(三) IO非阻塞操作 .
- Linux网络编程三:非阻塞epoll
- java网络编程(三)--非阻塞IO(通道、缓冲区、选择器)
- linux 网络编程【三】 非阻塞通信select
- linux 网络编程【三】 非阻塞通信select
- unix网络编程(五)--IO复用+非阻塞
- UNIX网络编程笔记(12)—非阻塞IO
- Linux C 网络编程——6. IO阻塞、非阻塞、复用、信号驱动、异步驱动
- Linux C 网络编程——6. IO阻塞、非阻塞、复用、信号驱动、异步驱动
- 深入linux网络编程(三):异步阻塞IO —— epoll
- 深入Linux网络编程(三):异步阻塞IO—epoll
- 深入linux网络编程(三):异步阻塞IO —— epoll
- 深入linux网络编程(三):异步阻塞IO —— epoll
- 深入linux网络编程(三):异步阻塞IO —— epoll
- 深入linux网络编程(三):异步阻塞IO —— epoll
- 深入linux网络编程(三):异步阻塞IO —— epoll
- 阻塞与非阻塞IO -- 网络编程随想
- 菱形块
- mysql 存储引擎 InnoDB和myisam存储引擎的区别 /(自己小结)
- ubuntu 11 硬盘安装
- UNIX Makefile 的写法
- 在Ubuntu Natty中解除系统托盘限制
- Linux网络编程(三) IO非阻塞操作
- spring3.0 aspectj 的配置与使用
- AutoPostBack属性值为True和False的含义 (即为和不和服务器交互)
- Qt 中文显示问题
- 特殊符号大全
- jqGrid的简单应用
- 深入分析纯css画圆角矩形原理
- Code Co-op 5.2a 延长试用期的办法
- Java学习笔记(一) Java基础以及数据类型介绍