最近在做项目,需要做一个服务器和客户端的基于TCP的套接口网络编程,由于服务器端返回数据并不是那么的及时,因此,需要在客户端做些延迟,然后才能去读取数据,实验测试结果如下。
首先,我们先来看一下我们封装好的一个读延时函数:
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while() /**
* read timeout - 读超时检测函数,不含读操作
* @fd: 文件描述符
* @wait_seconds: 等待超时秒数,如果为0标识不检测超时
* 成功(未超时)返回0, 失败返回-1, 超时返回-1并且errno = ETIMEOUT
*/
int read_timeout(int fd, unsigned int wait_seconds)
{
int ret;
if(wait_seconds > )
{
fd_set read_fdset;
struct timeval timeout; FD_ZERO(&read_fdset);
FD_SET(fd, &read_fdset); timeout.tv_sec = wait_seconds;
timeout.tv_usec = ; do
{
ret = select(fd + , &read_fdset, NULL, NULL, &timeout);
}while(ret < && errno == EINTR); if(ret == )//fail
{
//time out.
ret = -;
errno = ETIMEDOUT;
}
else if(ret == )//success
{
ret = ;
}
}
return ret;
}
下面,我们介绍如何使用该函数,伪代码如下:
int ret = read_timeout(sockfd, 15);
if(ret == 0)
{
readnum = read(sockfd, recvbuff, sizeof(recvbuff));
}
else if(ret == -1 && errno == ETIMEDOUT)
{
//time out dealing.
}
好,现在继续看我的服务器与客户端程序:
服务器
void str_echo(int sock)
{
ssize_t n;
char buff[]; again:
while( (n = read(sock, buff, sizeof(buff))) > )
{
fputs(buff, stdout);
sleep();//for testing client read_timeout
write(sock, buff, n);
}
if(n < && errno == EINTR)
{
goto again;
}
else if(n < )
{
ERR_EXIT("read");
}
} int main()
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in servaddr, cliaddr; if( (listenfd = socket(AF_INET, SOCK_STREAM, )) < )
{
ERR_EXIT("socket");
} memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(); if((bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) < )
{
ERR_EXIT("bind");
} if( (listen(listenfd, SOMAXCONN)) < )
{
ERR_EXIT("listen");
} for(;;)
{
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);
if(connfd < )
{
ERR_EXIT("connect");
} if( (childpid = fork()) == )
{
//child
close(listenfd);
str_echo(connfd);
exit();
}
else
{
//parent
close(connfd);
} }
}
客户端
void str_cli(int sock)
{
char sendbuff[];
char recvbuff[]; memset(sendbuff, , sizeof(sendbuff));
memset(recvbuff, , sizeof(recvbuff));
int ret = -; //ssize_t n;
while(fgets(sendbuff, sizeof(sendbuff), stdin) != NULL)
{
write(sock, sendbuff, strlen(sendbuff)); ret = read_timeout(sock, );
if(ret == )
{
read(sock, recvbuff, sizeof(recvbuff));
}
else if(ret == - && errno == ETIMEDOUT)
{
ERR_EXIT("read_timeout");
}
fputs(recvbuff, stdout);
}
} int main(int argc, char **argv)
{ int sockfd;
struct sockaddr_in servaddr;
memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(); sockfd = socket(AF_INET, SOCK_STREAM, );
if(sockfd < )
{
ERR_EXIT("socket");
} if( (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) < )
{
ERR_EXIT("connect");
} str_cli(sockfd);
return ;
}
例子一:
服务器延时3s, 客户端read_timeout(socd, 5);结果为:成功
《UNIX网络编程》之read_timeout实验的更多相关文章
-
【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)
RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...
-
【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
-
【Linux/unix网络编程】之使用socket进行TCP编程
实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...
-
unix网络编程环境搭建
unix网络编程环境搭建 网络编程 环境 1.点击下载源代码 可以通过下列官网中的源代码目录下载最新代码: http://www.unpbook.com/src.html 2.解压文件 tar -xz ...
-
UNIX网络编程——getsockname和getpeername函数
UNIX网络编程--getsockname和getpeername函数 来源:网络转载 http://www.educity.cn/linux/1241293.html 这两个函数或者 ...
-
20145211 《Java程序设计》实验报告五————Java网络编程及安全实验报告
实验内容 1.掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 这一部分是与我的partner合作的,详见他的博客- [20145326 <Java程序设计> ...
-
Unix网络编程--卷二:进程间通信
Unix网络编程--卷二:进程间通信 本书是一部Unix网络编程的经典之作!进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机网络应用程序的必要条件.本书从对Po ...
-
Unix网络编程--卷一:套接字联网API
UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 0.准备环境 1.简介 2.传输层:TCP.UD ...
-
[转载] 读《UNIX网络编程 卷1:套接字联网API》
原文: http://cstdlib.com/tech/2014/10/09/read-unix-network-programming-1/ 文章写的很清楚, 适合初学者 最近看了<UNIX网 ...
-
UNIX网络编程
UNIX网络编程--socket的keep http://www.68idc.cn/help/opersys/unixbsd/20150731471448.html
随机推荐
-
POJ 1637 Sightseeing tour(混合图的欧拉回路)
题目链接 建个图,套个模板. #include <cstdio> #include <cstring> #include <iostream> #include & ...
-
上传文件fileupload
文件上传: 需要使用控件-fileupload 1.如何判断是否选中文件? FileUpload.FileName - 选中文件的文件名,如果长度不大于0,那么说明没选中任何文件 js - f.va ...
-
Android -- ImageSwitch和Gallery 混合使用
1. 实现效果
-
关于Redis info的参数总结
Redis官网对 info 已经讲解的比较清楚的,参考文档 .可以看到,info的输出结果是分几块的,有Servers.Clients.Memory等等,通过info后面接这些参数,可以指定输出某一块 ...
-
border-raduis 在IE8中的兼容性问题
border-raduis 是css3新增加的属性,我们运用起来也很方便,效果很好,但是在IE8以及之前的ie版本并不支持这个属性,怎么解决这个问题呢? 1.切成背景 这也是我经常用到的方法,虽然说有 ...
-
【Java】运用泽勒一致性计算某天是星期几
/** * Created by liangjiahao on 2017/2/26. * 运用泽勒一致性计算某天是星期几? * 公式: * h = (q + 26(m+1)/10 + k +k/4 + ...
-
jieba库及词频统计
import jieba txt = open("C:\\Users\\Administrator\\Desktop\\流浪地球.txt", "r", enco ...
-
D3算法编写决策树
前言 所谓构建决策树, 就是递归的对数据集参数进行“最优特征”的选择.然后按最优特征分类成各个子数据集,继续递归. 最优特征的选择:依次计算按照各个特征进行分类以后数据集的熵,各个子数据集的熵比较后, ...
-
node代码打包为 exe文件---端口进程关闭demo
最近用到 java,用tomcat起的服务,经常服务关了,对应的进程还在跑,导致再次启动服务失败,需要手动关闭进程. 使用 dos命令虽然只有两行,总是输,也很烦. netstat -ano | fi ...
-
MySQL笔记(2)
SQL 的约束 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性.. 1 约束分类 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性. ...