socket 编程 基于 select 实现的回射客户端/服务程序

github 代码 地址

  • unp.h
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/select.h>#define MAXLINE 4096
#define SERV_PORT 9877
#define LISTENQ 1024void str_echo(int sockfd);
void err_sys(const char *, ...);// client interface
void str_cli(FILE *fp, int sockfd);
  • echo_client.c
#include    "unp.h"
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>int main(int argc, char **argv) {int sockfd[5];struct sockaddr_in servaddr;int i=0;for (i=0; i<5; i++) {sockfd[i] = socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);connect(sockfd[i], (struct sockaddr*)&servaddr, sizeof(servaddr));}str_cli(stdin, sockfd[0]);exit(0);    
}
  • str_cli.c
#include "unp.h"// maxline 4096int max(int a, int b) {return a>b? a : b;
}void str_cli(FILE *fp, int sockfd) {int maxfdp1, stdineof;fd_set rset;char sendline[MAXLINE], receline[MAXLINE];int n;stdineof = 0;FD_ZERO(&rset);for (; ;) {// fileno 将标准 I/O 文件指针转换为对应的描述符if (stdineof == 0) {FD_SET(fileno(fp), &rset);}FD_SET(sockfd, &rset);maxfdp1 = max(fileno(fp), sockfd) + 1;select(maxfdp1, &rset, NULL, NULL, NULL);// 如果服务挂掉,客户端可以接受到消息,并退出if (FD_ISSET(sockfd, &rset)) { // socket is readableif ((n = read(sockfd, receline, MAXLINE)) == 0) {if (stdineof == 1) {return;} else {printf("str_cli: server terminated prematurely");return;}}write(fileno(stdout), receline, strlen(receline));bzero(receline, strlen(receline));}if (FD_ISSET(fileno(fp), &rset)) {if ( (n = read(fileno(stdin), sendline, MAXLINE) == 0) ){stdineof = 1;shutdown(sockfd, SHUT_WR);FD_CLR(fileno(fp), &rset);continue;}write(sockfd, sendline, strlen(sendline));bzero(sendline, strlen(sendline));}}
}
  • echo_service.c
#include    "unp.h"int main(int argc, char **argv) {int i, maxi, maxfd, listenfd, connfd, sockfd;int nready, client[FD_SETSIZE];size_t n;fd_set rset, allset;char buf[MAXLINE];socklen_t clilen;struct sockaddr_in cliaddr, servaddr;listenfd = socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));listen(listenfd, LISTENQ);maxfd = listenfd;maxi = -1;	// client 数组当前使用项的最大下标for(i=0; i<FD_SETSIZE; i++) {client[i] = -1;}FD_ZERO(&allset);FD_SET(listenfd, &allset);for(;;) {rset = allset;nready = select(maxfd+1, &rset, NULL, NULL, NULL);if(FD_ISSET(listenfd, &rset)) {clilen = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);for (i=0; i<FD_SETSIZE; i++) {if (client[i] < 0 ) {client[i] = connfd;break;}}if (i == FD_SETSIZE) {exit(0);}FD_SET(connfd, &allset);if (connfd > maxfd) {maxfd = connfd;}if (i > maxi) {maxi = i;}if (--nready <= 0) {continue;}}for (i = 0; i <= maxi; i++) {if ((sockfd = client[i]) < 0) {continue;}if (FD_ISSET(sockfd, &rset)) {if ( ( n = read(sockfd, buf, MAXLINE)) == 0) {close(sockfd);FD_CLR(sockfd, &allset);client[i] = -1;} else {write(sockfd, buf, n);}if (--nready <= 0) {break;}}}}
}
  • CMakeList.txt
project(echo_srv)
set(CMAKE_CXX_STANDARD 11)
add_executable(echo_srv echo_service.c error.c)# client
add_executable(echo_cli echo_client.c str_cli.c)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyEclipse的优化

出自&#xff1a;http://blog.csdn.net/u010124571/article/details/41316255?refmyread 第一步: 取消自动validation validation有一堆&#xff0c;什么xml、jsp、jsf、js等等&#xff0c;我们没有必要全部都去自动校验一下&#xff0c;只是需要的时候才会手工校验一下&…

NSlog输出

NSLog的定义 void NSLog(NSString *format, …); 基本上&#xff0c;NSLog很像printf&#xff0c;同样会在console中输出显示结果。不同的是&#xff0c;传递进去的格式化字符是NSString的对象&#xff0c;而不是char *这种字符串指针。 实例 NSLog可以如下面的方法使用&#x…

推理题,会则秒解

你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a;桌子上有一堆石头&#xff0c;每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人&#xff0c;每一步都是最优解。 编写一个函数&#xff0c;来判断你是否可以在给定石头…

【图论】割点、桥、双连通

连通分量 个数可以通过一次BFS或者DFS得到 割点和桥 可以枚举删除每一个点或者每一条边&#xff0c;判断连通分量个数是否增加 更好的方法 该算法是R.Tarjan发明的。对图深度优先搜索&#xff0c;定义DFS(u)为u在搜索树&#xff08;以下简称为树&#xff09;中被遍历到的次序号…

奇酷手机显示Log

1、在桌面点击拨号&#xff0c;在拨号盘输入“*20121220#”&#xff0c;进入工程模式;2、看到日志输出等级&#xff0c;点进去 Log print enable 选 enable Java log level 选 LOGV C and C log level 选 LOGV Kernel log level 选 KERN_DEBUG3、完毕 参考网址&#xff1a;http…

getCanonicalPath getAbsolutePath区别

1、在winows环境下它们的区别是 &#xfeff;&#xfeff;getCanonicalPath是标准路径&#xff0c;没有特殊字符&#xff0c;getAbsolutePath是有特殊字符的 2、在AIX系统中它们的区别&#xff1a; 首先编译&#xff1a;javac com/ai/test/BugTest.java 然后运行&#xff1a;ja…

Hbase与hive整合

//hive与hbase整合create table lectrure.hbase_lecture10(sname string, score int) stored by org.apache.hadoop.hive.hbase.HBaseStorageHandler whth serdeproperties("hbase.columns.mapping" :key,cf1:score)tblproperties("hbase.table.name" &q…

C++实现一个http服务器

一个简单的博客后端服务器 github地址&#xff0c;持续更新 设计参考 #define MYSQLPP_MYSQL_HEADERS_BURIED #include "httplib.h" #include "rapidjson/document.h" #include <mysql/mysql.h> #include <iostream> #include <string>…

KMP算法的java实现

package com.trs.utils;public class KMPStr {/** 在KMP算法中&#xff0c;最难求的就是next函数&#xff0c;如何理解next函数是一个难题&#xff0c;特别是knext[k]&#xff0c;这里* 需要指出的是当p[i]!p[j]时&#xff0c;我们只有通过回溯将k的值逐渐减小&#xff0c;貌似…

线段分割法实现微信抢红包

无意间看到的一种实现抢红包的方法&#xff0c;于是用C实现了一下。 将一个红包分成 n 份 具体的思路是&#xff0c;将一个红包看作是一个线段&#xff0c;线段的长就是红包总金额&#xff0c;然后在这个线段上随机切 n-1 刀&#xff0c;分成 n 份&#xff0c;然后抢红包的人依…

JAVA多线程和并发基础面试问答(转载)

JAVA多线程和并发基础面试问答 原文链接&#xff1a;http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里&#xff0c;从面试的角度列出了大部分重要的问题&#xff0c…

Linux的学习--crontab

之前了解过一点crontab&#xff0c;前段时间比较闲&#xff0c;就熟悉了一下&#xff0c;今天总结记录一下。 crontab命令常见于Unix和类Unix的操作系统之中&#xff0c;用于设置周期性被执行的指令。该命令从标准输入设备读取指令&#xff0c;并将其存放于"crontab"…

C++雪花算法实现

看来一下雪花算法的实现方法&#xff0c;用 c试着实现了一下&#xff0c;这里仅仅是实现了算法的流程&#xff0c;但是具体的细节&#xff0c;如并发、多线程访问等等没有具体考虑。 雪花算法的简单讲解参考 #include <sys/select.h> #include <iostream> #includ…

CAlayer层的属性

iOS开发UI篇—CAlayer层的属性 一、position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性&#xff1a;position和anchorPoint property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) property CGPoint anchorPoint; 称为“定位点”、…

Window Linux下实现指定目录内文件变更的监控方法

转自&#xff1a;http://qbaok.blog.163.com/blog/static/10129265201112302014782/ 对于监控指定目录内文件变更&#xff0c;window 系统提供了两个未公开API&#xff1a;SHChangeNotifyRegister SHChangeNotifyDeregister 分别用于注册Notify以及监视。 同时&#xff0c;还提…

Odoo9发行说明

2015年10月1日&#xff0c;期待已久的Odoo9正式发布。本文是Odoo9正式版发行说明&#xff0c;基于官网资料翻译。 译者: 苏州-微尘原文地址&#xff1a;https://www.odoo.com/page/odoo-9-release-notes译文地址&#xff1a;http://blog.csdn.net/wangnan537/article/details/4…

揭秘史上最完美一步到位的搭建Andoriod开发环境

Windows环境下Android开发环境搭建虽然不难而且网上资料众多&#xff0c;但是众多资料如出一折 忽略了很多细节&#xff0c;最终还是没能达到满意效果。 基本步骤如下&#xff1a;JDK安装、环境变量配置、Eclipse下载、AndoriodSDK下载安装、下载配置ADT但是到这里还不算完美搞…

基于OpenCv的人脸检测、识别系统学习制作笔记之二

在网上找到了一个博客&#xff0c;里面有大量内容适合初学者接触和了解人脸检测的博文&#xff0c;正好符合我目前的学习方面&#xff0c;故将链接放上来&#xff0c;后续将分类原博客的博文并加上学习笔记。 传送门&#xff1a; http://blog.sina.com.cn/s/articlelist_160256…

URL 化

URL化。编写一种方法&#xff0c;将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符&#xff0c;并且知道字符串的“真实”长度。&#xff08;注&#xff1a;用Java实现的话&#xff0c;请使用字符数组实现&#xff0c;以便直接在数组上操作。&#xf…

第一章 00 StringUtil.cpp和StringUtil.hh分析

1 /*2 * StringUtil.hh3 *4 * Copyright 2002, Log4cpp Project. All rights reserved.5 *6 * See the COPYING file for the terms of usage and distribution.7 */8 头文件的说明&#xff0c;以及与版权相关的说明一般都会放置在文件的开始位置 9 #ifndef _LOG4CPP_STR…