【多进程】

【多线程】

 /*************************************************************************
> File summary: 多线程服务器
> Author:
> Mail: xls0930@163.com
> Created Time: Sun 27 Jan 2019 10:08:19 PM CST
************************************************************************/ #include<stdio.h>
#include<string.h>
#include<arpa/inet.h>
#include<pthread.h>
#include<ctype.h>
#include<unistd.h>
#include<fcntl.h> #define MAXLINE 8192
#define SERV_PORT 8000 struct s_info
{
struct sockaddr_in cliaddr;
int connfd;
}; // 回调函数
void *do_work(void *arg)
{
int n,i;
struct s_info *ts = (struct s_info *)arg;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN]; while()
{
// 读出客户端的信息,关于read的返回值:返回n(n>0)表示读出n字节的数据,返回0表示已经读到结尾(可以理解为对端已关闭)
n = read(ts->connfd,buf,MAXLINE);
if(n == )
{
printf("the client %d close...\n", ts->connfd);
//跳出循环
break;
}
//打印输出客户端的ip+port
printf("received from %s at PORT %d\n",
inet_ntop(AF_INET, &(*ts).cliaddr.sin_addr,str,sizeof(str)), ntohs((*ts).cliaddr.sin_port));
//对读出的信息进行小写转大写操作
for(i = ; i < n;i++)
{
buf[i] = toupper(buf[i]);
}
// 写到服务器的标准输出
write(STDOUT_FILENO,buf,n);
// 写回客户端
write(ts->connfd,buf,n);
}
close(ts->connfd);
return (void *);
} int main()
{
struct sockaddr_in servaddr,cliaddr;
socklen_t cliaddr_len;
int listenfd,connfd;
pthread_t tid; struct s_info ts[]; // 创建结构体数组
int i = ; listenfd = socket(AF_INET,SOCK_STREAM,); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT); bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); listen(listenfd, ); printf("accepting client connect ...\n"); while()
{
cliaddr_len = sizeof(cliaddr);
// listenfd做监听,connfd与客户端进行读写操作,connfd中存放着客户端的信息
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
ts[i].cliaddr = cliaddr;
ts[i].connfd = connfd; pthread_create(&tid,NULL,do_work,(void*)&ts[i]);
// 回收子线程
pthread_detach(tid);
i++;
}
return ; }

我们可以使用nc命令来模拟客户端,对代码进行测试。

【网络编程三】网络通信之多进程(线程)实现TCP通信(一)的更多相关文章

  1. Linux网络编程(三)

    Linux网络编程(三) wait()还是waitpid() Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进 ...

  2. Linux 网络编程三(socket代码详解)

    //网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  3. java网络编程基础——TCP网络编程三

    AIO实现非阻塞通信 java7 NIO2 提供了异步Channel支持,这种异步Channel可以提供更高效的IO,这种基于异步Channel的IO被称为异步IO(Asynchronous IO) ...

  4. 网络编程学习笔记(二)基于TCP的Socket编程

    1.Socket:英文意思插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket. 2.Socket通常用来实现client-server(客户端 ...

  5. 网络编程基础之C/S架构和TCP/IP协议

    一.何谓C/S架构 C指的是client(客户端软件),S指的是Server(服务端软件),既然我们的的标题是网络编程基础, 那我们就一起来学习怎样写一个C/S架构的软件,实现服务端与客户端软件基于网 ...

  6. java 25 - 2 网络编程之 网络通信三要素

    网络通信三要素 IP地址: InetAddress 网络中设备的标识,不易记忆,可用主机名(计算机的标识号) 端口号: 用于标识进程的逻辑地址,不同进程的标识(正在运行的软件的标识号) 传输协议: 通 ...

  7. Java高并发网络编程(三)NIO

    从Java 1.4开始,Java提供了新的非阻塞IO操作API,用意是替代Java IO和Java Networking相关的API. NIO中有三个核心组件: Buffer缓冲区 Channel通道 ...

  8. python之网络编程--锁、信号量、线程、队列

    一.线程,可以发现顺序执行比开线程执行时间要短.原因是,一个进程中的多线程处理,由于存在GIL,并且GIL中只能存在一个线程,加上线程又存在切换的问题,所以时间耗得多.想要解决这个问题,是开几个进程, ...

  9. PHP7 网络编程(一)多进程初探

    准备 我们都知道PHP是单进程执行的,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEMON守 ...

随机推荐

  1. js乱码问题解决

    乱码有可能出现在下面两种情况 1.高级浏览器直接访问js路径 2.jsp引用js 针对上述两种情况的解决方式: 1.查看设置浏览器的字符集 2.查看web服务器的字符集,比如Tomcat 配置UTF- ...

  2. MethodInfo类的一般使用

    1.MethodInfo类是在System.Reflection命名空间底下,既然是在Reflection空间底下.故名思议关于反射相关的操作,其中比较重要的方法是Invoke()方法,它 是加载相同 ...

  3. Lazarus 中文汉字解决方案

    使用Lazarus不得不面对编码问题,尤其中文.Lazarus使用的是UTF8编码,而很多windows程序使用的是ANSI编码,编码问题在此不多说大家可以google去. ANSI数据库与Lazar ...

  4. UNITY2018开启deepprofiling

    ADB方式调试游戏步骤 前提: 1,手机开启 [开发者模式][USB调试] 2,数据线连接手机和电脑 3,安装adb(注意adb版本不对可能导致adb deveices找不到设备,那就换个adb版本) ...

  5. Dos命令快速设置ip、网关、dns地址

    netsh interface ip set address name="本地连接" source=static 192.168.1.8 255.255.255.0 192.168 ...

  6. mysql 设置多个字段聚合自增

    DROP TEMPORARY TABLE IF EXISTS ttp_firstInvest; CREATE TEMPORARY TABLE ttp_firstInvest ( userid varc ...

  7. Java文件上传:Restful接口接收上传文件,缓存在本地

    接口代码 import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; i ...

  8. 02_数据库基础之(二)sql语句入门

    1.基本增删改查操作 #一. 数据类型 常用的3中 # .字符串 例如:你的名字 我是中国人 在数据库中要使用 ‘’引起来 '苹果手机' # .整数类型 例如: 你的年龄 ,办公室的人数 个 ,直接使 ...

  9. Java判断一个字符串中有多少大写字母、小写字母和数字

    Java判断一个字符串中有多少大写字母.小写字母和数字 思路: 大写字母就是A-Z之间,小写字母是a-z之间,数字就是0-9之间,于是做判断就好:用到的String知识点,遍历字符串, 长度方法len ...

  10. IN_ITEMBOMROUTING中的数据被过滤 到IN_ITEMBOMROUTING_TEMP

    ' ; 解决方法: 检查如下数据是否存在就可以知道为什么被过滤 掉 ' ) ' )