echo_server服务器多线程版本

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <memory.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <sys/select.h>
#include <poll.h>
#include <pthread.h> int sockfd; void sign_handler(int signo)
{
pid_t pid;
int stat;
if(signo==SIGINT)
{
printf("echo server close\n");
close(sockfd);
exit();
}
if(signo==SIGCHLD){
printf("client close\n");
wait();
}
return;
}
void out_fd(int fd)
{
struct sockaddr_in arr;
socklen_t len=sizeof(arr);
if(getpeername(fd,(struct sockaddr*)&arr,&len)<){
perror("getpeername fail\n");
exit();
}
char ip[]; memset(&ip,,sizeof(ip));
inet_ntop(AF_INET,&arr.sin_addr.s_addr,ip,sizeof(ip));
printf("%s connected\n",ip);
}
void server_do(int fd)
{
char buffer[BUFSIZ];
while(){
printf("ready to read\n");
memset(buffer,,sizeof(buffer));
ssize_t size;
if((size=read(fd,buffer,sizeof(buffer)))<){
perror("server child read fail\n");
break;
}else if(size==){
break;
}else{
printf("number of received bytes=%ld\n",size);
buffer[size-]='\0';
printf("%s\n",buffer);
if(write(fd,buffer,size)<){
if(errno==EPIPE){
break;
}
perror("server child write fail\n");
}
}
}
}
void *doit(void *arg)
{
int fd=*((int *)arg); server_do(fd); close(fd);
return (void*);
} int main(int argc,char *argv[])
{
if(argc<)
{
printf("usage:%s <port>",argv[]);
exit();
}
//注册信号
if(signal(SIGINT,sign_handler)==SIG_ERR){
perror("signal sigint error\n");
exit();
}
if(signal(SIGCHLD,sign_handler)==SIG_ERR){
perror("signal sigint error\n");
exit();
}
/*create socket*/
sockfd=socket(AF_INET,SOCK_STREAM,);
if(sockfd<){
perror("socket create fail\n");
exit();
}
/*bind socket*/
struct sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[]));
serveraddr.sin_addr.s_addr=INADDR_ANY;
if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<){
perror("socket bind fail\n");
exit();
}
if(listen(sockfd,)<){
perror("socket listen fail\n");
exit();
}
//设置线程的分离属性
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); int *iptr; while(){
iptr=malloc(sizeof(int)); if((*iptr=accept(sockfd,NULL,NULL))>){
out_fd(*iptr);
}
pthread_t th;
int err;
if((err=pthread_create(&th,&attr,doit,iptr))!=){
perror("pthread create fail\n");
}
pthread_attr_destroy(&attr);
}
return ;
}

echo_client客户端多线程版本

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <memory.h>
#include <signal.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int sockfd; void doit(void *arg)
{
char buffer[BUFSIZ];
ssize_t size;
while((size=read(STDIN_FILENO,buffer,sizeof(buffer)))>){
buffer[size-]='\0';
write(sockfd,buffer,size);
}
shutdown(sockfd,SHUT_WR);
}
void cli_do(int sockfd)
{
char buffer[BUFSIZ];
pthread_t th;
ssize_t size; pthread_create(&th,NULL,doit,NULL);
while((size=read(sockfd,buffer,sizeof(buffer)))>){
buffer[size-]='\0';
write(STDOUT_FILENO,buffer,size);
}
}
int main(int argc,char *argv[])
{
if(argc<){
printf("usage:%s <ip><port>",argv[]);
exit();
}
/*create socket*/
sockfd=socket(AF_INET,SOCK_STREAM,);
if(sockfd<){
perror("socket create fail\n");
}
struct sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[]));
inet_pton(AF_INET,argv[],&serveraddr.sin_addr.s_addr);
if(connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<){
perror("server connect fail\n");
exit();
}
cli_do(sockfd);
close(sockfd);
return ;
}

Linux网络编程echo多线程服务器的更多相关文章

  1. linux网络编程echo多进程服务器

    echo_server 多进程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #incl ...

  2. Linux网络编程——tcp并发服务器(poll实现)

    想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...

  3. Linux 网络编程: echo Service

    前言 大病初愈,感谢某人的陪伴,感谢王乐庆同学和赵攀同学的细心照顾.原以为过了第八周就不忙了,却没想到还有明天的党章考试.还是写代码比背党章有意思~趁着服务器还没过期,赶紧把 echo 完成了.关于错 ...

  4. Linux网络编程:客户端/服务器的简单实现

    一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个 ...

  5. 服务器编程入门(4)Linux网络编程基础API

      问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字( ...

  6. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  7. Linux网络编程服务器模型选择之并发服务器(上)

    与循环服务器的串行处理不同,并发服务器对服务请求并发处理.循环服务器只能够一个一个的处理客户端的请求,显然效率很低.并发服务器通过建立多个子进程来实现对请求的并发处理.并发服务器的一个难点是如何确定子 ...

  8. linux高性能服务器编程 (五) --Linux网络编程基础api

    第五章 Linux网络编程基础api 1.主机字节序和网络字节序 字节序是指整数在内存中保存的顺序.字节序分为大端字节序.小端字节序. 大端字节序:一个整数的高位字节数据存放在内存的低地址处.低位字节 ...

  9. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

随机推荐

  1. 搞一个app需要多久?

    //转载文章,看后有感 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要进来干一场,尽管王总从事的行当也算跟IT沾边,但毕竟太长时 ...

  2. HDU 2295.Radar (DLX重复覆盖)

    2分答案+DLX判断可行 不使用的估计函数的可重复覆盖的搜索树将十分庞大 #include <iostream> #include <cstring> #include < ...

  3. mysql 连接问题----转载

    最近碰到一个mysql5数据库的问题.就是一个标准的servlet/tomcat网络应用,后台使用mysql数据库.问题是待机一晚上后,第二天早上第一次登录总是失败.察看日志发现如下错误: “com. ...

  4. 装了SVN,你的关联图标变了没有?

    装了SVN,你的关联图标变了没有? 开始合作之后,装上了SVN,非常高效,我在VS写了一部分的代码,上传之后,别人通过下载或是更新,就更新到了合作同伴的VS里,相当于大家在一个VS里写代码.和保强他们 ...

  5. 那些年被我坑过的Python——一夫当关 第十三章(堡垒机初步设计)

      堡垒机架构 堡垒机的主要作用权限控制和用户行为审计,堡垒机就像一个城堡的大门,城堡里的所有建筑就是你不同的业务系统 , 每个想进入城堡的人都必须经过城堡大门并经过大门守卫的授权,每个进入城堡的人必 ...

  6. 1、MyBatisNet的安装使用

    用到的几个DLL按理说应该到官网下载,但这个官网是谷大哥的,不知道是不是被屏蔽,总打不开,幸好从别人的程序里拷过来一份,直接放在自己的程序里就行! 程序结构如下: Providers.config,S ...

  7. BZOJ 2572 高速公路

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收 ...

  8. js/jquery/插件表单验证

    媳妇要学js,就收集一些资料给她. 1.js 表单验证 : http://hi.baidu.com/yanchao0901/item/161f563fb84ea5433075a1eb 2.jquery ...

  9. Unity3d场景合并

    Unity3d场景合并 一.Unity3d场景合并,有一次的情况是这样的,就是我们是每个人都在开发,每个人有不同的场景,那么合并的时候,有些会出问题,那么我有一个好的方案,就是首先弄一个公共的资源库, ...

  10. ESXI转HYPER-V,问题接二连三啊(VMDK转VHD)

    首先说软件: 要不是用SCVMM来转的话,我用得最爽的还是WINIMAGE,自然流畅.其它的都有各种问题. 其次说说配置更改: 如果原ESXI里只有一个硬盘,一切好说,如果里面挂载了两个,甚至三个硬盘 ...