实例一:不支持并发,单服务器---单客户端

/*************************************************************************
> File Name: ser01.c
> Author:
> Mail:
> Created Time: 2015年11月22日 星期日 10时22分17秒
************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h> int main()
{
//int socket(int domain, int type, int protocol);
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(8001);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr)); listen(sockfd, 128); struct sockaddr cliaddr;
socklen_t clilen;
int connfd;
connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &clilen); char recvbuf[2014] = {0};
int recvcount = 0; while(1){
recvcount = read(connfd, recvbuf,1024);
if (recvcount == 0){
printf("read is over.\n");
printf("the client is over.\n");
exit(0);
}
else if (recvcount == -1){
perror("read error.\n");
exit(EXIT_FAILURE);
}
fputs(recvbuf, stdout);
write(connfd, recvbuf, strlen(recvbuf));
memset(recvbuf, 0, 1024);
} exit(0);
}
/*************************************************************************
> File Name: cli01.c
> Author:
> Mail:
> Created Time: 2015年11月22日 星期日 11时56分05秒
************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h> int main()
{ int sockfd, ret;
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(8001);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); sockfd = socket(AF_INET, SOCK_STREAM, 0); ret = connect(sockfd, (struct sockaddr*)&seraddr, sizeof(seraddr));
if(ret == -1){
perror("bind error.\n");
exit(EXIT_FAILURE);
} char recvbuf[1024] = {0};
char sendbuff[1024] = {0}; while(fgets(sendbuff, 1024, stdin) != NULL){
write(sockfd, sendbuff, strlen(sendbuff));
read(sockfd, recvbuf, 1024);
fputs(recvbuf, stdout);
memset(recvbuf, 0, 1024);
memset(sendbuff, 0, 1024);
} exit(0);
}

server:

client:

实例二:支持多并发,单服务器----多客户端

/*************************************************************************
> File Name: ser02.c
> Author:
> Mail:
> Created Time: 2015年11月22日 星期日 10时22分17秒
************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h> int main()
{
//int socket(int domain, int type, int protocol);
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(8001);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr)); listen(sockfd, 128); struct sockaddr_in cliaddr;
socklen_t clilen; int connfd;
char recvbuf[2014] = {0};
int recvcount = 0; while(1){
connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &clilen);
if(connfd == -1){
perror("accept error.\n");
exit(EXIT_FAILURE);
}
pid_t pid = fork(); if(pid == 0){
while(1){
recvcount = read(connfd, recvbuf,1024);
if (recvcount == 0){
printf("%s:%d is over.\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
exit(0);
}
else if (recvcount == -1){
perror("read error.\n");
exit(EXIT_FAILURE);
}
printf("%d receive from %s:%d - ", getpid(), inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
fputs(recvbuf, stdout);
write(connfd, recvbuf, strlen(recvbuf));
memset(recvbuf, 0, 1024);
}
}
else if(pid > 0){ }
else if(pid < 0){
perror("fork error.\n");
exit(EXIT_FAILURE);
}
} exit(0);
}
/*************************************************************************
> File Name: cli02.c
> Author:
> Mail:
> Created Time: 2015年11月22日 星期日 11时56分05秒
************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h> int main()
{ int sockfd, ret;
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(8001);
seraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); sockfd = socket(AF_INET, SOCK_STREAM, 0); ret = connect(sockfd, (struct sockaddr*)&seraddr, sizeof(seraddr));
if(ret == -1){
perror("bind error.\n");
exit(EXIT_FAILURE);
} char recvbuf[1024] = {0};
char sendbuff[1024] = {0}; while(fgets(sendbuff, 1024, stdin) != NULL){
write(sockfd, sendbuff, strlen(sendbuff));
read(sockfd, recvbuf, 1024);
printf("receive from %s:%d - ", inet_ntoa(seraddr.sin_addr), ntohs(seraddr.sin_port));
fputs(recvbuf, stdout);
memset(recvbuf, 0, 1024);
memset(sendbuff, 0, 1024);
} exit(0);
}

server:

client1:

client2:

client3:

server(此时三个客户端退出):

linux支持并发的服务器回射程序实例的更多相关文章

  1. unp TCP 客户端服务器回射程序中对SIGCHLD信号的处理

    第五章中,有一个例子模拟客户端并发的终止TCP连接,服务器捕捉并处理SIGCHLD信号并调用waitpid函数防止僵死进程的出现.信号处理函数中核心的一句是: , &statloc, WNOH ...

  2. Socket 入门- 客户端回射程序

    结果输出:------------------------------------------------------客户端:xx@xxxxxx:~/Public/C$ ./postBackCli.o ...

  3. TCP简单回射程序

    一.程序功能 (1)客户从标准输入读入一行文本行,并写给服务器: (2)服务器从网络输入读入这行文本,并回射给客户: (3)客户从网络输入读入这行回射文本,并显示在标准输出上 二.服务器程序 #inc ...

  4. 简单回射程序之处理accept返回EINTR错误的服务器程序版本

    #include <stdio.h> #include <stdlib.h> #include <time.h> #include <errno.h> ...

  5. python实现支持并发、断点续传的Ftp程序

    一.要求 1.用户md5认证 2.支持多用户同时登陆(并发) 3.进入用户的命令行模式,支持cd切换目录,ls查看目录子文件 4.执行命令(ipconfig) 5.传输文件: a.支持断点续传 b.传 ...

  6. 第五十六节,python实现支持并发、断点续传的Ftp程序

    一.要求 1.用户md5认证 2.支持多用户同时登陆(并发) 3.进入用户的命令行模式,支持cd切换目录,ls查看目录子文件 4.执行命令(ipconfig) 5.传输文件: a.支持断点续传 b.传 ...

  7. unix域数据报回射程序(不完整)

    一.服务器程序 int main(int argc, char **argv) { int sockfd; struct sockaddr_un servaddr, cliaddr; sockfd = ...

  8. unix域字节流回射程序

    一.服务端程序 #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <uni ...

  9. 第十篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 上 )

    前言 本文将讲解一对经典的客户/服务器回射程序,感受网络编程的大致框架( 该程序稍作改装即可演变成各种提供其他服务的程序 ):同时,还将对其运行过程加以分析,观察程序背后协议的执行细节,学习调试网络程 ...

随机推荐

  1. Java8-ConcurrentUtils

    import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; public class Conc ...

  2. 2019牛客暑期多校训练营(第五场)F maximum clique 1 二分图求最大独立集

    https://ac.nowcoder.com/acm/contest/885/F #include <bits/stdc++.h> //CLOCKS_PER_SEC #define se ...

  3. BZOJ 4013/Luogu P3240 [HNOI2015] 实验比较 (树形DP)

    题目传送门 分析 放一个dalao博客: xyz32768 的博客,看完再回来看本蒟蒻的口胡吧(其实嘛-不回来也行) 精髓是合并的方案数的计算,至于为什么是Ci−1j−1\large C_{i-1}^ ...

  4. harbor1.9仓库同步迁移

    harbor 1.9 实战的仓库迁移,过程实际上就是从A push 到B.16个tag 不到100G,挺快的 1分钟多. 假设我们从A迁移到B. 1.先在A上面建立一个目标仓库.    

  5. 23、自动装配-Aware注入Spring底层组件&原理

    23.自动装配-Aware注入Spring底层组件&原理 Aware 接口,提供了类似回调函数的功能 自定义组件想要使用Spring 容器底层的一些组件(Application Context ...

  6. learning express step(十一)

    learning express.Router() code: const express = require('express'); const app = express(); var route ...

  7. 路飞项目-ContentType组件

    ContentType组件 -- 应用 价格策略 常见问题 优惠券 -- 一张表跟多张表建立外键关系的 -- 用法 # 第一步 先生成ForeignKey字段 关联ContentType conten ...

  8. 简单删除我的电脑里的wps云文档图标

    装个wps,用着都挺好,我的电脑一直存在wps云文档的图标. 看久了就觉得很膈应,那就直接干掉吧. 桌面新建一个文本文件,选中新建文本文档.txt 按f2 然后修改为11.reg(任意名称只要保证后缀 ...

  9. 爬虫之解析库BeautifulSoup

    介绍 Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等 ...

  10. 编写第一个Servlet程序

    在开始这一节之前呢,我们还需要把Tomcat配置到Eclipse中,配置的方式很简单,打开Eclipse,Window,Preferences,进入到这个页面 将Tomcat的安装目录配置到Eclip ...