Linux网络编程(三)
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 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(&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 <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(&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 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)) < 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;
- }
#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)) < 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网络编程(三)相关推荐
- 【Linux网络编程】TCP三次握手和四次挥手
00. 目录 文章目录 00. 目录 01. 三次握手 02. 四次挥手 03. 三次握手和四次挥手原因 04. 2MSL 05. 附录 01. 三次握手 在 TCP/IP 协议中,TCP 协议提供可 ...
- linux网络编程(三)select、poll和epoll
linux网络编程(三)select.poll和epoll 一.为什么会有多路I/O转接服务器? 二.select 三.poll 三.epoll 一.为什么会有多路I/O转接服务器? 为什么会有多路I ...
- 详情讲述Linux网络编程关注的问题丨epoll原理丨reactor模型丨三次挥手丨四次握手丨多线程丨单线程丨C/C++Linux丨C++后端开发
90分钟搞懂linux网络编程关注的问题 1. 三次挥手,四次握手 2. epoll实现原理剖析 3. reactor模型封装 单线程.多线程以及多进程 视频讲解如下,点击观看: 详情讲述Linux网 ...
- 【Linux】网络编程三:TCP通信和UDP通信介绍及代码编写
参考连接:https://www.nowcoder.com/study/live/504/2/16. [Linux]网络编程一:网络结构模式.MAC/IP/端口.网络模型.协议及网络通信过程简单介绍 ...
- Linux网络编程实例分析
最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...
- Linux网络编程必看书籍推荐
首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...
- 基于UDP客户端服务器的编程模型-linux网络编程
坚持在代码中注释,边读代码边学习Linux网络编程 使用到的发送函数原型: #include <sys/types.h>#include <sys/socket.h>ssize ...
- 【Linux】一步一步学Linux网络编程教程汇总(更新中......)
00. 目录 文章目录 00. 目录 01. 基础理论知识 02. 初级编程 03. 高级编程 04. LibEvent库 05. 06. 07. 01. 基础理论知识 [Linux网络编程]网络协议 ...
- 【Linux网络编程】TCP网络编程中connect listen和accept三者之间的关系
00. 目录 文章目录 00. 目录 01. TCP服务端和客户端流程 02. connect函数 03. listen函数 04. 三次握手 05. accept函数 06. 附录 01. TCP服 ...
- 【Linux网络编程】无连接和面向连接协议
00. 目录 文章目录 00. 目录 01. 概述 02. 附录 01. 概述 网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议 ...
最新文章
- 计算机三年工作经验和研究生,三年工作经验和读三年研究生到底哪个更值?这个回答很权威...
- php内打开网址,网站内部跳转外部网站go.php
- PMP-【第1章 引论】-2020-12-07(18页-24页)
- 第八章 CTE 递归 及 分组汇总 高级部分(多维数据集)
- oracle预定义异常
- 高性能Mysql数据库表设计原则
- Leetcode每日一题:763.partition-labels(划分字母区间)
- HDU2028 Lowest Common Multiple Plus【GCD+LCM】
- apex英雄机器人探路者怎么玩_LOL有哪些英雄,是你怎么玩都玩不会的?
- 在vs编辑器里走来走去的快捷键
- 0606关于mysql优化原理
- windows10系统如何安装日语输入法
- win10如何删除注册表残留文件
- Android系统的心脏-Zygote进程启动流程分析
- Collaborative Spatiotemporal Feature Learning for Video Action Recognition 论文笔记
- 谢少荣到计算机学院,我校校友谢少荣应邀回母校交流并受聘顾问教授
- Python-进程池的阻塞式(不能体现多进程的优势)
- LeetCode位运算(找出落单的数,二进制中1的个数,2的幂等)
- h5 微信分享和踩坑指南
- [从头读历史] 第269节 诗经 卫风
热门文章
- Java实现比较APP版本号大小
- 缺少微信小程序测试经验?这篇文章带你从0开始
- mysql查询提示_MySQL自成一派的查询提示
- 3D游戏编程与设计-井字棋
- 关于企业价值观的一点点感悟
- NVIDIA NCCL优化——利用共享内存实现比NCCL更快的集合通信
- php 模拟鼠标点击,Python全局模拟鼠标点击操作(以至善网无聊评价点击作为案例)...
- js-页面需展示大量图片时,采用lyz.delayLoading.min.js,图片在屏幕时加载显示
- oracle-01722,函数subtr,instr
- 有关爬虫浏览量的问题