IO非阻塞操作

sock的方法不一定非得是阻塞的,也可以非阻塞的操作。有两种方法分别为设置fcntl 和设置相应函数的参数。

服务端:

[cpp] view plain copy print ?
  1. #include <sys/socket.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. #include <errno.h>
  9. #define  BUFSIZE 128
  10. int main(int argc,char *argv[]){
  11. int server_sockfd, client_sockfd;
  12. int server_len, client_len;
  13. struct sockaddr_in server_address;
  14. struct sockaddr_in client_address;
  15. int i,byte;
  16. char char_send[BUFSIZE];
  17. server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
  18. bzero(&server_address, sizeof(server_address));
  19. server_address.sin_family = AF_INET;
  20. server_address.sin_port = htons(7838);
  21. server_address.sin_addr.s_addr = INADDR_ANY;
  22. server_len = sizeof(server_address);
  23. if ((bind(server_sockfd, (struct sockaddr *)&server_address, server_len))== -1) {
  24. perror(”bind”);
  25. exit(EXIT_FAILURE);
  26. }
  27. listen(server_sockfd, 5);
  28. printf(”server waiting for connect\n”);
  29. client_len = sizeof(client_address);
  30. client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, (socklen_t *)&client_len);
  31. for(i=0;i<5;i++){
  32. memset(char_send,’\0’,BUFSIZE);
  33. printf(”input message to send:”);
  34. fgets(char_send,BUFSIZE,stdin);
  35. if((byte=send(client_sockfd,char_send,strlen(char_send),0))==-1){
  36. perror(”send”);
  37. exit(EXIT_FAILURE);
  38. }
  39. memset(char_send,’\0’,BUFSIZE);
  40. //最后一个参数为非阻塞的设置
  41. byte = recv(client_sockfd, char_send, BUFSIZE,MSG_DONTWAIT);
  42. if(byte > 0){
  43. printf(”get %d message:%s”, byte, char_send);
  44. byte=0;
  45. }else if(byte<0){
  46. if(errno==EAGAIN){
  47. errno=0;
  48. continue;
  49. }else{
  50. perror(”recv”);
  51. exit(EXIT_FAILURE);
  52. }
  53. }
  54. }
  55. shutdown(client_sockfd,2);
  56. shutdown(server_sockfd,2);
  57. }
#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 128

int 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(&amp;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 *)&amp;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 *)&amp;client_address, (socklen_t *)&amp;client_len);for(i=0;i&lt;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 &gt; 0){printf("get %d message:%s", byte, char_send);byte=0;}else if(byte&lt;0){if(errno==EAGAIN){errno=0;continue;}else{perror("recv");exit(EXIT_FAILURE);}}
}
shutdown(client_sockfd,2);
shutdown(server_sockfd,2);

}

客户端:

[cpp] view plain copy print ?
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <errno.h>
  4. #include <sys/socket.h>
  5. #include <resolv.h>
  6. #include <stdlib.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>
  10. #include <fcntl.h>
  11. #define MAXBUF 128
  12. int main(int argc, char *argv){  
  13. int sockfd, ret, i;
  14. struct sockaddr_in dest, mine;
  15. char buffer[MAXBUF + 1];
  16. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  17. perror(”Socket”);
  18. exit(EXIT_FAILURE);
  19. }
  20. bzero(&dest, sizeof(dest));
  21. dest.sin_family = AF_INET;
  22. dest.sin_port = htons(7838);
  23. if(argc<2){
  24. printf(”Usage: %s <dest ip> <src ip>”,argv[0]);
  25. exit(1);
  26. }
  27. if (inet_aton(argv[1], (struct in_addr ) &dest.sin_addr.s_addr) == 0){
  28. perror(argv[1]);
  29. exit(1);
  30. }
  31. bzero(&mine, sizeof(mine));
  32. mine.sin_family = AF_INET;
  33. mine.sin_port = htons(7839);
  34. if (inet_aton(argv[2], (struct in_addr ) &mine.sin_addr.s_addr) == 0){  
  35. perror(argv[2]);
  36. exit(EXIT_FAILURE);
  37. }
  38. if (bind(sockfd, (struct sockaddr ) &mine, sizeof(struct sockaddr)) == -1){
  39. perror(argv[3]);
  40. exit(EXIT_FAILURE);
  41. }
  42. printf(”will connect!\n”);
  43. if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
  44. perror(”Connect ”);
  45. exit(EXIT_FAILURE);
  46. }
  47. //设置sock连接的非阻塞
  48. if(fcntl(sockfd, F_SETFL, O_NONBLOCK) == -1) {
  49. perror(”fcntl”);
  50. exit(EXIT_FAILURE);
  51. }
  52. while(1){
  53. bzero(buffer, MAXBUF + 1);
  54. //因为在socket中设置过,所以就不用再设置了
  55. ret = recv(sockfd, buffer, MAXBUF, 0);
  56. if(ret > 0){
  57. printf(”get %d message:%s”, ret, buffer);
  58. ret=0;
  59. }else if(ret < 0) {
  60. if(errno == EAGAIN) {
  61. errno=0;
  62. continue;
  63. }else{
  64. perror(”recv”);
  65. exit(EXIT_FAILURE);
  66. }
  67. }
  68. memset( buffer,’\0’,MAXBUF+1);
  69. printf(”input message to send:”);
  70. fgets( buffer,MAXBUF,stdin);
  71. if((ret=send(sockfd,buffer,strlen(buffer),0))==-1){
  72. perror(”send”);
  73. exit(EXIT_FAILURE);
  74. }
  75. }
  76. close(sockfd);
  77. return 0;
  78. }
#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 128

int 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)) &lt; 0) {perror("Socket");exit(EXIT_FAILURE);
}bzero(&amp;dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(7838);
if(argc&lt;2){printf("Usage: %s &lt;dest ip&gt; &lt;src ip&gt;",argv[0]);exit(1);
}
if (inet_aton(argv[1], (struct in_addr *) &amp;dest.sin_addr.s_addr) == 0){perror(argv[1]);exit(1);
}bzero(&amp;mine, sizeof(mine));
mine.sin_family = AF_INET;
mine.sin_port = htons(7839);
if (inet_aton(argv[2], (struct in_addr *) &amp;mine.sin_addr.s_addr) == 0){perror(argv[2]);exit(EXIT_FAILURE);
}
if (bind(sockfd, (struct sockaddr *) &amp;mine, sizeof(struct sockaddr)) == -1){perror(argv[3]);exit(EXIT_FAILURE);
}
printf("will connect!\n");
if (connect(sockfd, (struct sockaddr *) &amp;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 &gt; 0){printf("get %d message:%s", ret, buffer);ret=0;}else if(ret &lt; 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网络编程(三)相关推荐

  1. 【Linux网络编程】TCP三次握手和四次挥手

    00. 目录 文章目录 00. 目录 01. 三次握手 02. 四次挥手 03. 三次握手和四次挥手原因 04. 2MSL 05. 附录 01. 三次握手 在 TCP/IP 协议中,TCP 协议提供可 ...

  2. linux网络编程(三)select、poll和epoll

    linux网络编程(三)select.poll和epoll 一.为什么会有多路I/O转接服务器? 二.select 三.poll 三.epoll 一.为什么会有多路I/O转接服务器? 为什么会有多路I ...

  3. 详情讲述Linux网络编程关注的问题丨epoll原理丨reactor模型丨三次挥手丨四次握手丨多线程丨单线程丨C/C++Linux丨C++后端开发

    90分钟搞懂linux网络编程关注的问题 1. 三次挥手,四次握手 2. epoll实现原理剖析 3. reactor模型封装 单线程.多线程以及多进程 视频讲解如下,点击观看: 详情讲述Linux网 ...

  4. 【Linux】网络编程三:TCP通信和UDP通信介绍及代码编写

    参考连接:https://www.nowcoder.com/study/live/504/2/16. [Linux]网络编程一:网络结构模式.MAC/IP/端口.网络模型.协议及网络通信过程简单介绍 ...

  5. Linux网络编程实例分析

    最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...

  6. Linux网络编程必看书籍推荐

    首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...

  7. 基于UDP客户端服务器的编程模型-linux网络编程

    坚持在代码中注释,边读代码边学习Linux网络编程 使用到的发送函数原型: #include <sys/types.h>#include <sys/socket.h>ssize ...

  8. 【Linux】一步一步学Linux网络编程教程汇总(更新中......)

    00. 目录 文章目录 00. 目录 01. 基础理论知识 02. 初级编程 03. 高级编程 04. LibEvent库 05. 06. 07. 01. 基础理论知识 [Linux网络编程]网络协议 ...

  9. 【Linux网络编程】TCP网络编程中connect listen和accept三者之间的关系

    00. 目录 文章目录 00. 目录 01. TCP服务端和客户端流程 02. connect函数 03. listen函数 04. 三次握手 05. accept函数 06. 附录 01. TCP服 ...

  10. 【Linux网络编程】无连接和面向连接协议

    00. 目录 文章目录 00. 目录 01. 概述 02. 附录 01. 概述 网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议 ...

最新文章

  1. 计算机三年工作经验和研究生,三年工作经验和读三年研究生到底哪个更值?这个回答很权威...
  2. php内打开网址,网站内部跳转外部网站go.php
  3. PMP-【第1章 引论】-2020-12-07(18页-24页)
  4. 第八章 CTE 递归 及 分组汇总 高级部分(多维数据集)
  5. oracle预定义异常
  6. 高性能Mysql数据库表设计原则
  7. Leetcode每日一题:763.partition-labels(划分字母区间)
  8. HDU2028 Lowest Common Multiple Plus【GCD+LCM】
  9. apex英雄机器人探路者怎么玩_LOL有哪些英雄,是你怎么玩都玩不会的?
  10. 在vs编辑器里走来走去的快捷键
  11. 0606关于mysql优化原理
  12. windows10系统如何安装日语输入法
  13. win10如何删除注册表残留文件
  14. Android系统的心脏-Zygote进程启动流程分析
  15. Collaborative Spatiotemporal Feature Learning for Video Action Recognition 论文笔记
  16. 谢少荣到计算机学院,我校校友谢少荣应邀回母校交流并受聘顾问教授
  17. Python-进程池的阻塞式(不能体现多进程的优势)
  18. LeetCode位运算(找出落单的数,二进制中1的个数,2的幂等)
  19. h5 微信分享和踩坑指南
  20. [从头读历史] 第269节 诗经 卫风

热门文章

  1. Java实现比较APP版本号大小
  2. 缺少微信小程序测试经验?这篇文章带你从0开始
  3. mysql查询提示_MySQL自成一派的查询提示
  4. 3D游戏编程与设计-井字棋
  5. 关于企业价值观的一点点感悟
  6. NVIDIA NCCL优化——利用共享内存实现比NCCL更快的集合通信
  7. php 模拟鼠标点击,Python全局模拟鼠标点击操作(以至善网无聊评价点击作为案例)...
  8. js-页面需展示大量图片时,采用lyz.delayLoading.min.js,图片在屏幕时加载显示
  9. oracle-01722,函数subtr,instr
  10. 有关爬虫浏览量的问题