当前位置:首页 >> 计算机软件及应用 >>

linux网络编程select函数使用例程


最近上课,老师非让我们用 select()函数编写一个网络程序,其主要是想让我们练习 一下数据的 IO 和复用,翻看书上就是一个小例子,调了一阵还不好使,最后参考 linux 典 藏大系的《linux 网络编程》宋敬彬、孙海滨等编著的书才搞定的,书上也没有一个完整的 例子,我照着敲又改了一下,今天决定共享出来,当然程序调试是好使的,实现是客户端向 服务端查询时间,客户端通过 TCP 链接往服务端发送“what's the time?”时,服务端通过 select()函数查询 10S 看有没数据,如果有是“what's the time?”数据,就往客户端发送 时间。 服务端例程如下: process.c 文件内容如下: void process_conn_server(int s) { ssize_t size = 0; char buffer[1024]; //接受缓冲区 char buff[1024]; //发送给客户端缓冲区 time_t ticks; //获取当前时间 ticks = time(NULL); fd_setrd; structtimevaltv; int err; while(1) { FD_ZERO(&rd); FD_SET(s,&rd); tv.tv_sec = 10; //设定查询 10S 钟 tv.tv_usec = 0; err = select(s+1,&rd,NULL,NULL,&tv); if(err == -1) //出错处理 { perror("select()"); } else if(err) //有数据 { size = read(s,buffer,1024); //读取数据 if(size == 0) return ; if(size>0) { if(strncmp(buffer,"what's the time?",strlen("what's time?"))==0) //判断是否为"what's the time?" { sprintf(buff,"%.24s\r\n",ctime(&ticks)); //将当前时间装入到发送缓冲区 write(s,buff,strlen(buff)); //发送给客户端 }

the

else error!报错 { write(s,"error!\n",strlen("error!\n")); } } } else { printf("NO data within ten seconds.\n"); } } } void proccess_conn_client(int s) { ssize_t size = 0; char buffer[1024]; while(1) { size = read(0,buffer,1024); if(size>0) { send(s,buffer,size,0); size = recv(s,buffer,1024,0); write(1,buffer,size); } } } void sig_proccess(intsigno) { printf("Catch a exit signal\n"); exit(0); } void sig_pipe(int sign) { printf("Catch a SIGPIPE signal\n"); } #include #include #include #include #include #include <'stdio.h> <'stdlib.h> <'strings.h> <'sys/types.h> <'sys/socket.h> <'unistd.h>

// 字 符 匹 配 不 对 时 , 发 送 给 客 户 端

//规定时间内没收到数据提示

#include <'linux/in.h> #include <'signal.h> #include "time.h" #include "process.c" extern void sig_proccess(intsigno); extern void process_conn_server(int s); #define PORT 8888 #define BACKLOG 2 int main(intargc,char *argv[]) { intss,sc; structsockaddr_inserver_addr; structsockaddr_inclient_addr; int err; pid_tpid; signal(SIGINT,sig_proccess); signal(SIGPIPE,sig_proccess); ss = socket(AF_INET,SOCK_STREAM,0); if(ss<0) { printf("socket error\n"); return -1; } bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(PORT); err = bind(ss,(structsockaddr *)&server_addr,sizeof(server_addr)); if(err<0) { printf("bind error"); return -1; } err = listen(ss,BACKLOG); if(err<0) { printf("listen error"); return -1; } while(1) { intaddrlen = sizeof(structsockaddr); sc = accept(ss,(structsockaddr*)&client_addr,&addrlen);

if(sc<0) { continue; } pid = fork(); if(pid == 0) { close(ss); process_conn_server(sc); } else { close(sc); } } } 客户端例程如下: #include <'stdio.h> #include <'stdlib.h> #include <'strings.h> #include <'sys/types.h> #include <'sys/socket.h> #include <'unistd.h> #include <'linux/in.h> #include <'signal.h> #include "process.c" extern void sig_proccess(intsigno); extern void sig_pipe(int sign); extern void proccess_conn_client(int s); static int s; void sig_proccess_client(intsigno) { printf("Catch a exit signal\n"); close(s); exit(0); } #define PORT 8888 int main(intargc,char *argv[]) { structsockaddr_inserver_addr; int err; if(argc == 1){

printf("PLS input server addr\n"); return 0; } signal(SIGINT,sig_proccess); signal(SIGPIPE,sig_pipe); s = socket(AF_INET,SOCK_STREAM,0); if(s<0) { printf("socket error\n"); return -1; } bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(PORT); inet_pton(AF_INET,argv[1],&server_addr.sin_addr); connect(s,(structsockaddr*)&server_addr,sizeof(structsockaddr)); proccess_conn_client(s); close(s); } 运行过程如下: 客户端:

服务端:



相关文章:
Linux socket select 函数用法详解
Linux socket select 函数用法详解_计算机软件及应用_...例程分析: #include <stdio.h> #include <stdlib....linux select 语句 13页 免费 winsocket编程几种模式...
linux网络编程常用函数详解与实例(socket--bind--liste...
linux 网络编程常用函数详解与实例(socket-->bind-->listen-->accept)( 网络编程常用函数详解与实例( ) 常用的网络命令: netstat 命令 netstat 是用来显示网络的...
linux Select函数用法详解
select 使用 { case -1: exit(-1);break; //select 错误,退出程序 case ...linux串口编程 43页 免费 C++网络编程Select函数用... 10页 免费 linux_Socket...
实验九 Linux网络编程(报告)
掌握嵌入式网络程序设计 实验原理: linux 网络编程是通过 socket(套接字)接口...3.编写面向 TCP 数据流的基于多路复用的(使用 select 函数)socket 通信程 序...
linux网络编程-通过setsockopt函数使socket号重用
linux网络编程-通过setsockopt函数使socket号重用_计算机软件及应用_IT/计算机_专业...如果在发送数据的时,希望不经历由系统缓冲区到 socket 缓冲区的拷贝而影响 程序...
Linux网络编程一步一步学
Linux网络编程一步一步学_IT/计算机_专业资料。很好的Linux编程资料Linux 网络编程一步一步学-同步聊天程序 什么是异步通讯? 就是通讯任意一方可以任意发送消息,有...
linux下socket编程与实例
linux下socket编程实例_计算机软件及应用_IT/计算机...转换成网络字节顺序,对无符号短型进行操作 4bytes ...Select 函数原型为: int select(int numfds,fd_...
select 函数用法
(我所说的是 Unix 系统下的伯克利 socket 编程,和...举个简单的例子,就是从网络上 接受数据写入一个...linux c 语言 select 函数用法 表头文件 #i nclude...
fcntl和select函数彻底搞明白
select 函数详细使用 select 系统调用是用来让我们的程序监视多个文件句柄(file ...Linux 网络编程一步一步学-select 详解 *purpose: 详细说明 select 的用法 **...
Linux串口select编程
Linux串口select编程_计算机软件及应用_IT/计算机_专业资料。Linux 下串口程序开发...2.1 读串口读取串口数据使用文件操作 read 函数读取,如果设置为原始模式(Raw Mod...
更多相关标签: