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

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 Select函数用法详解
select 使用 { case -1: exit(-1);break; //select 错误,退出程序 case ...linux串口编程 43页 免费 C++网络编程Select函数用... 10页 免费 linux_Socket...
Linux串口select编程
Linux串口select编程_计算机软件及应用_IT/计算机_专业资料。Linux 下串口程序开发...2.1 读串口读取串口数据使用文件操作 read 函数读取,如果设置为原始模式(Raw Mod...
linux中select函数的使用
linuxselect 函数使用 Select 在 Socket 编程中还是比较重要的,可是对于初学 Socket 的人来说都不 太爱用 Select 写程序, 他们只是习惯写诸如 connect、 ...
Linux网络编程:用C语言实现的聊天程序(同步通信)
Linux网络编程:用C语言实现的聊天程序(同步通信)_计算机软件及应用_IT/计算机_专业...select 函数就实现了这个功能。 2、select 函数原型 int select (int maxfdp1...
select函数用法
可是对于初学 Socket 的人来说都不太爱用 Select 写程序,他们只是习惯写诸如 ...linux Select函数用法详... 6页 1下载券 C++网络编程Select函数用... 10页 ...
Linux网络编程一步一步学
Linux 网络编程一步一步学-同步聊天程序 什么是异步通讯? 就是通讯任意一方可以...(sc, &rdfds); 在使用 select 函数之前,一定要找到 3 个句柄中的最大值...
实验九 Linux网络编程(报告)
掌握嵌入式网络程序设计 实验原理: linux 网络编程是通过 socket(套接字)接口...3.编写面向 TCP 数据流的基于多路复用的(使用 select 函数)socket 通信程 序...
Linux程序设计上机四(网络编程)
Linux程序设计上机四(网络编程)_计算机软件及应用_IT/计算机_专业资料。计算机...再次调用 select 前,需要重新赋值 fd_set fd_read; fd_set fd_select; ...
windows编程中select函数的使用
windows编程select函数使用_计算机软件及应用_IT/...应用程序可通过 WSAGetLastError()获 取相应错误代码...{...} } 二、linux c 中 select(I/O 多工...
更多相关标签: