TCP并发服务器简单示例
并发服务器的思想是每一个客户的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理
1. 服务器端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <netdb.h>
#include <pthread.h> //线程执行函数负责读写
void *thr_fn(void *arg)
{
int size, j;
char recv_buf[];
int *parg = (int *)arg;
int new_fd = *parg; printf("new_fd = %d\n", new_fd); while((size=read(new_fd, recv_buf, )) > )
{
if(recv_buf[]=='@')
break;
printf("Message from client(%d): %s\n",size,recv_buf);
for(j = ; j < size; j++)
recv_buf[j] = toupper(recv_buf[j]);
write(new_fd, recv_buf, size);
} close(new_fd); return ;
} int main(int argc,char *argv[])
{
socklen_t clt_addr_len;
int listen_fd;
int com_fd;
int ret;
int i;
static char recv_buf[];
int len;
int port;
pthread_t tid; struct sockaddr_in clt_addr;
struct sockaddr_in srv_addr; //服务器端运行时要给出端口信息,该端口为监听端口
if(argc != )
{
printf("Usage:%s port\n", argv[]);
return ;
} //获得输入的端口
port = atoi(argv[]); //创建套接字用于服务器的监听
listen_fd = socket(PF_INET, SOCK_STREAM, );
if(listen_fd < )
{
perror("cannot create listening socket");
return ;
} //填充关于服务器的套节字信息
memset(&srv_addr, , sizeof(srv_addr)); srv_addr.sin_family = AF_INET;
srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
srv_addr.sin_port = htons(port); //将服务器和套节字绑定
ret = bind(listen_fd, (struct sockaddr *)&srv_addr, sizeof(srv_addr));
if(ret == -)
{
perror("cannot bind server socket");
close(listen_fd);
return ;
} //监听指定端口,连接5个客户端
ret = listen(listen_fd, );
if(ret == -)
{
perror("cannot listen the client connect request");
close(listen_fd);
return ;
}
//对每个连接来的客户端创建一个线程,单独与其进行通信
//首先调用read函数读取客户端发送来的信息
//将其转换成大写后发送回客户端
//当输入“@”时,程序退出
while()
{
len = sizeof(clt_addr); com_fd = accept(listen_fd, (struct sockaddr *)&clt_addr, &len);
if(com_fd < )
{
if(errno == EINTR)
{
continue;
}
else
{
perror("cannot accept client connect request");
close(listen_fd); return ;
}
} printf("com_fd = %d\n", com_fd);//打印建立连接的客户端产生的套节字
if((pthread_create(&tid, NULL, thr_fn, &com_fd)) == -)
{
perror("pthread_create error");
close(listen_fd);
close(com_fd); return ;
}
} return ;
}
2. 客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netdb.h>
#include <unistd.h> int main(int argc,char *argv[])
{
int connect_fd;
int ret;
char snd_buf[];
int i;
int port;
int len; static struct sockaddr_in srv_addr; //客户端运行需要给出具体的连接地址和端口
if(argc != )
{
printf("Usage: %s server_ip_address port\n",argv[]);
return ;
} //获得输入的端口
port = atoi(argv[]); //创建套节字用于客户端的连接
connect_fd = socket(PF_INET,SOCK_STREAM,);
if(connect_fd < )
{
perror("cannot create communication socket");
return ;
} //填充关于服务器的套节字信息
memset(&srv_addr, , sizeof(srv_addr)); srv_addr.sin_family = AF_INET;
srv_addr.sin_addr.s_addr = inet_addr(argv[]);
srv_addr.sin_port = htons(port); //连接指定的服务器
ret = connect(connect_fd, (struct sockaddr *)&srv_addr, sizeof(srv_addr));
if(ret == -)
{
perror("cannot connect to the server");
close(connect_fd);
return ;
} memset(snd_buf, , );
//用户输入信息后,程序将输入的信息通过套接字发送给服务器
//然后调用read函数从服务器中读取发送来的信息
//当输入“@”时,程序退出
while()
{
write(STDOUT_FILENO, "input message:", );
len = read(STDIN_FILENO, snd_buf, );
if(len > )
write(connect_fd, snd_buf, len);
len = read(connect_fd, snd_buf, len);
if(len > )
printf("Message form server: %s\n", snd_buf);
if(snd_buf[] == '@')
break;
} close(connect_fd); return ;
}
TCP并发服务器简单示例的更多相关文章
- UNIX网络编程 第5章 TCP客户/服务器程序示例
UNIX网络编程 第5章 TCP客户/服务器程序示例
- TCP通讯模型简单示例
1. TCP通讯模型 2. 服务器端 ① 创建socket,用函数socket() ② 绑定IP地址.端口号等信息到socket上,用函数bind() ③ 设置允许的最大连接数,用函数listen() ...
- tcp并发服务器(c20w)
** 原创文章,请勿转载 ** 并发服务器是一个老生常谈的话题,今天这里也写一个. 1. 目标: 同时在线连接20万(c20w). 开发语言:重要的事情说三遍,GOLANG, GOLANG, GOLA ...
- UNIX网络编程---TCP客户/服务器程序示例(五)
一.概述 客户从标准输入读入一行文本,并写给服务器 服务器从网络输入读入这行文本,并回射给客户 客户从网络输入读入这行回射文本,并显示在标准输出上 二.TCP回射服务器程序:main函数 这里给了函数 ...
- 3.网络编程-tcp的服务器简单实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/1/13 22:03 # @Author : ChenAdong # @ema ...
- 【Unix 网络编程】TCP 客户/服务器简单 Socket 程序
建立一个 TCP 连接时会发生下述情形: 1. 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这三个函数来完成,我们称之为被动打开. 2. 客户通过调用 c ...
- TCP客户/服务器简单Socket程序
建立一个 TCP 连接时会发生下述情形: 1. 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这三个函数来完成,我们称之为被动打开. 2. 客户通过调用 c ...
- Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
- Linux select TCP并发服务器与客户端编程
介绍:运行在ubuntu linux系统,需要先打开一个终端运行服务端代码,这时,可以打开多个终端同时运行多个客户端代码(注意客户端数目要小于MAX_FD);在客户端输入数据后回车,可以看见服务器收到 ...
随机推荐
- Linux_oracle命令大全(转)
Linux_oracle命令大全 一,启动 1.#su - oracle 切换到oracle用户且切换到它的环境 2.$lsnrctl status 查看 ...
- matlab 修改文件夹下所有文件名大写为小写
1. path = './DIR/';Files = dir(fullfile(path,'*.m'));LengthFiles = length(Files);for count_i = 1 : L ...
- Java Iterable类
查看java源代码 /* * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE ...
- ConcurrentHashMap的putIfAbsent
这个方法在key不存在的时候加入一个值,如果key存在就不放入,等价: if (!map.containsKey(key)) return map.put(key, value); else retu ...
- emr问题处理
--通过his病历号查询emr中对应的患者ID --通过患者ID找出患者所有的病历集合ID --通过病历集合查找患者所有的病历 --通过病历dataID查找对应的病历数据,病历存在大字段中 '; -- ...
- 使用JMeter的Java Sampler轻松定制自己的benchmark
做性能测试,接口测试,非常好 转自 http://www.iteye.com/topic/1123432 以前碰到更多的是WEB APP的性能测试,也许用得最多的是Loadrunner, Web S ...
- cin、cout、cerr、clog------c++ Primer Plus
cin对象与标准输入流相对应. cout对象与标准输出流相对应. cerr对象与标准错误流相对应,常用于程序错误信息,不缓冲,直接被发送给屏幕. clog对象也对应标准错误流(这点儿和cerr是一样的 ...
- Binder学习笔记(三)—— binder客户端是如何组织checkService数据的
起点从TestClient.cpp的main函数发起: int main() { sp < IServiceManager > sm = defaultServiceManager(); ...
- Total Commander的初次体验
从汉化新世纪下载到最新的TC张学思版后,运行文件只需依照其提示就可以完成该软件的安装.作为新手初次运行体验了以下功能: 一.目录跳转 1. 初次启动TC软件界面截图: 2. 按下Ctrl+d后,直接再 ...
- 前端基础:call,apply,bind的的理解
背景 前两天在做小程序的需求的时候用到bind的时候才想起自己对这三的东西的了解比较浅薄,这个时候用的时候就有点怕.时候还是要好好学习下,理解下怎么玩. 正文 先说call 和 apply吧:ECMA ...