Linux网络编程echo多线程服务器
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多线程服务器的更多相关文章
- linux网络编程echo多进程服务器
echo_server 多进程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #incl ...
- Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
- Linux 网络编程: echo Service
前言 大病初愈,感谢某人的陪伴,感谢王乐庆同学和赵攀同学的细心照顾.原以为过了第八周就不忙了,却没想到还有明天的党章考试.还是写代码比背党章有意思~趁着服务器还没过期,赶紧把 echo 完成了.关于错 ...
- Linux网络编程:客户端/服务器的简单实现
一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个 ...
- 服务器编程入门(4)Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字( ...
- Linux 高性能服务器编程——Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字(so ...
- Linux网络编程服务器模型选择之并发服务器(上)
与循环服务器的串行处理不同,并发服务器对服务请求并发处理.循环服务器只能够一个一个的处理客户端的请求,显然效率很低.并发服务器通过建立多个子进程来实现对请求的并发处理.并发服务器的一个难点是如何确定子 ...
- linux高性能服务器编程 (五) --Linux网络编程基础api
第五章 Linux网络编程基础api 1.主机字节序和网络字节序 字节序是指整数在内存中保存的顺序.字节序分为大端字节序.小端字节序. 大端字节序:一个整数的高位字节数据存放在内存的低地址处.低位字节 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
随机推荐
- 判断PHP数组是否为空的代码
PHP判断数组为空首选方法:count($arr),size($arr); 复制代码 代码如下: $arr= array(""); echo count($arr); echo s ...
- POJ 2942.Knights of the Round Table (双连通)
简要题解: 意在判断哪些点在一个图的 奇环的双连通分量内. tarjan求出所有的点双连通分量,再用二分图染色判断每个双连通分量是否形成了奇环,记录哪些点出现在内奇环内 输出没有在奇环内的点的数目 ...
- Xcode 使用自定义字体
添加对应的字体(.ttf或.odf)到工程的resurce,使用cocos2d中的FontLabel库,FontLabel继承于UILabel,象UILabel一样使用就好了 fontName直接使用 ...
- 15_RHEL7挂载NTFS分区
1.下载ntfs-3g wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2015.3.14.tgz 2.安装 tar -zxvf ntfs-3 ...
- Android中AppWidget的分析与应用:AppWidgetProvider .
from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrv ...
- 那些年被我坑过的Python——山外有山(第四章)
装饰器: 定义: 本质是函数,(装饰其他函数)就是为其他函数添加附加功能原则: 1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 优点: 装饰器带来的最直观的好处:减少对函数的细化 ...
- launchpad bzr
在lp注册 一个 lp ID, 比如 alangwansui 然后添加 SSH keys.为自己的管理添加权限. 注册一个项目的 比如 melody. 然后就可以开始使用bzr 在这个项目下建 ...
- php开发环境安装配置(1)
个人记录高手请勿喷! 下载xampp我这是个中文版的可以自己搜索下载安装别的版本也行. 双击下载的xampp会提示路径相当于解压到指定的路径 到对应路径去可看到如下: 打开 2.配置: 成功之后会如下 ...
- 关于sql server 代理(已禁用代理xp)
由于有数据库在恢复,导致计划不能执行,先操作如下: 关闭数据库的服务..然后把数据库文件剪切出来.然后在起服务.进入SqlSever删除数据库.因为文件已经剪切走了.所以不会删除文件.再把数据库拷到M ...
- iOS uuchart 用法
这个是 画 折线图用的 一个 第三方文件 说白了就是一个 用 贝塞尔 曲线封装好的一个 第三方. 但是有机会还是需要看下怎么用