TCP并发server模型(三)
本篇博客讲述的是单client单线程模型,该模型相同由主进程统一accept,仅仅是将fork改为了pthread_create。
与进程相比,线程有非常多长处(速度快,占用资源少。数据能够共享)。
该模型结构如图所看到的:
与上一篇博客讲述的模型非常相似,源码同上一篇相比仅仅有少量更改而已,亦不解说。
服务器端代码例如以下:
/*
author:arvik
purpose:test the server simultaneity
email:1216601195@qq.com
csdn: http://blog.csdn.net/u012819339
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <pthread.h>
#define BUFFLEN 1024
#define SERVER_PORT 8887
#define BACKLOG 3
static void handle_request(void *argv)
{
int s_c = *((int *)argv);
char buff[BUFFLEN];
int n = 0;
memset(buff, 0, sizeof(buff));
n = recv(s_c, buff, BUFFLEN, 0);
if(n>0)
{
printf("receive msg from client: %s\n", buff);
}
close(s_c);
}
static int handle_connect(int s_s)
{
int s_c;
struct sockaddr_in from;
socklen_t len = sizeof(from);
pthread_t thread_do;
while(1)
{
s_c = accept(s_s, (struct sockaddr*)&from, &len); //block
if(s_c>0)
{
pthread_create(&thread_do, NULL, (void*)handle_request, &s_c);
}
}
}
int main()
{
int s_s;
struct sockaddr_in local;
s_s = socket(AF_INET, SOCK_STREAM, 0);
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_addr.s_addr = inet_addr("127.0.0.1");//htonl(INADDR_ANY);
local.sin_port = htons(SERVER_PORT);
if(bind(s_s, (struct sockaddr*)&local, sizeof(local)))
{
printf("bind socket failed!\n");
return -1;
}
listen(s_s, BACKLOG);
handle_connect(s_s);
close(s_s);
return 0;
}
client代码不变。
见上一篇博客!
TCP并发server模型(三)的更多相关文章
- TCP并发server,每个客户一个子进程
今天笔者带来的是server型号第一,这是最经常使用的模型的最基本的一个–TCP并发server,每个客户一个子进程. 首先简单介绍:TCP并发server,每个客户一个子进程,并发server调用f ...
- TCP/IP之封装,分用,server模型
ios讨论群1群:135718460 1.封装 当应用程序用TCP传送数据时,数据被送入到协议栈中,然后通过每一层直到被当做一串比特流送入网络. 2.分用 当目的主机收到以太网数据帧时,数据就開始从协 ...
- LINUX环境并发服务器的三种实现模型
服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了 ...
- 【UNIX网络编程(三)】TCP客户/server程序演示样例
上一节给出了TCP网络编程的函数.这一节使用那些基本函数编写一个完毕的TCP客户/server程序演示样例. 该样例运行的过程例如以下: 1.客户从标准输入读入一行文本,并写给server. 2.se ...
- Scala进阶之路-并发编程模型Akka入门篇
Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...
- Linux C语言 网络编程(二) server模型
前面介绍了关于连接linux服务端方式,可是服务端的资源是有限的,所以我们通常须要又一次思考,设计一套server模型来处理相应的client的请求. 第一种:并发server.通过主进程统一处理cl ...
- 几种server模型
TCP測试用客户程序 每次执行客户程序,在命令行參数指定server的ip地址,port,发起连接的子进程数,和一个待发送的字符串数据,客户程序将模拟多个客户依据指定的子进程数创建子进程来并发的连接到 ...
- TCP/IP具体解释--三次握手和四次握手 Dos攻击
TCP连接的状态图 TCP建立连接的三次握手过程,以及关闭连接的四次握手过程 贴一个telnet建立连接,断开连接的使用wireshark捕获的packet截图. 1.建立连接协议(三次握手) (1) ...
- 浅谈OSI七层网络模型和TCP/IP四层模型
OSI七层网络模型 OSI(Open System Interconnection)开放系统互连参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系. OSI七层模型 功能 ...
随机推荐
- IP地址便捷修改器 V3.5 绿色版
IP地址便捷修改器 V3.5 绿色版 http://www.downxia.com/downinfo/47786.html#softdown
- [c#]WebClient异步下载文件并显示进度
摘要 在项目开发中经常会用到下载文件,这里使用winform实现了一个带进度条的例子. 一个例子 using System; using System.Collections.Generic; usi ...
- mysql查询null异常:attempted to return null from a method with a primitive return type
select sum(deposit_amount)from tb_commission_ib_day mysql查询时报异常: attempted to return null from a met ...
- 转 UIAlertView 不显示、屏幕变灰
UIAlertView 不显示.屏幕变灰 SvenFang 票 在 [[NSNotificationCenter defaultCenter] addObserver:self selector:@s ...
- python文本 判断对象里面是否是类字符串
python文本 判断对象里面是否是类字符串 场景: 判断对象里面是否是类字符串 一般立刻会想到使用type()来实现 >>> def isExactlyAString(obj): ...
- 算法:Rate of Growth
Rate of growth describes how an algorithm’s complexity changes as the input size grows. This is comm ...
- 玩转rocketMQ
下载地址https://github.com/alibaba/RocketMQ 安装环境需要jdk,maven,git http://maven.apache.org/download.html
- [MAC OS] NSButton tag 获取
@IBAction func switchContentLayout(_ sender: Any) { let button : NSButton = sender as! NSButton;}
- Objective-C:动态绑定
// Complex.h // 03-动态绑定 // // Created by ma c on 15/8/11. // Copyright (c) 2015年. All rights reserve ...
- HTML5 Canvas,WebGL,CSS Shaders,GLSL的暧昧关系 【转】
HTML5 Canvas,WebGL,CSS Shaders,GLSL的暧昧关系 这篇文章发布于 2011年10月10日,星期一,17:14,归类于 canvas相关. 阅读 58013 次, 今日 ...