Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,是网络编程的“Hello World!”
在linux平台下,用多线程实现echo服务器与客户端“一对多”(即是一台服务器可以响应多个客户端的请求)。本人写了个demo,和大家一起分享,有不足的地方,请多多指教,我是壮壮熊。
编译时,在后面加上-lpthread。例如:g++ service2.cpp -o service2 -lpthread。否则会提示线程方面的错误。
echo服务器端代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<string.h>
#include<errno.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<iostream>
#include<pthread.h>
using namespace std; #define SERVERIP "192.168.1.117"
#define SERVERPORT 12345
#define MAXBUFFER 256 pthread_t ntid;//线程
int connfd;//客户端连接的ID
struct sockaddr_in clientaddr; void *printContext(void *arg)
{ char ip[]={};//用来存放客户端连接的IP地址
char readBuf[MAXBUFFER]={};
int ret;
pthread_detach(ntid);//线程退出时,可以清理内存
int pconnfd=connfd;//客户端连接的ID(main函数中的accept的返回值)
//线程自己要保存连接符 ID,因为进程在第二个客户端
//连接后,会覆盖connfd
printf("%s\n",inet_ntop(AF_INET,&clientaddr.sin_addr,ip,sizeof(ip)));
cout<<"connectd to the servce"<<endl; while(ret=read(pconnfd,readBuf,MAXBUFFER))//读客户端发送的数据
{
write(pconnfd,readBuf,MAXBUFFER);//写回客户端
printf("%s\n",readBuf);//打印传输的内容
bzero(readBuf,MAXBUFFER); }
if(ret==)
{
printf("the connection of client is close!\n"); }else
{
printf("read error:%s\n",strerror(errno));
}
pthread_exit();
} int main(int argc,char** argv)
{
socklen_t len;//socket长度类型
int serverFd,ret;
struct sockaddr_in serveraddr; serverFd=socket(AF_INET,SOCK_STREAM,);//创建socket
if(serverFd<)
{
printf("socket error:%s\n",strerror(errno));
exit(-);
} bzero(&serveraddr,sizeof(serveraddr));//serveraddr清零
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(SERVERPORT);
inet_pton(AF_INET,SERVERIP,&serveraddr.sin_addr);//将C语言字节序转化成网络字节序 ret=bind(serverFd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
if(ret!=)
{
close(serverFd);
printf("bind error:%\n",strerror(errno));
exit(-);
} ret=listen(serverFd,);//监听
if(ret!=)
{
close(serverFd);
printf("listen error:%s\n",strerror(errno));
exit(-);
}
//clientaddr清零
len=sizeof(clientaddr);
bzero(&clientaddr,sizeof(clientaddr));
while()
{
//接收客户端的连接,然后启动线程去处理客户端发送的
//请求。线程只要保存connfd 即可。进程在第二个客户 端
//连接进来的时候,会覆盖第一个客户端的connfd
connfd=accept(serverFd,(struct sockaddr *) &clientaddr,&len);
if(connfd<)
{
printf("accept error:%s\n",strerror(errno));
continue;
} int err;
err=pthread_create(&ntid,NULL,printContext,NULL);
if(err!=)
{
cout<<"can't create pthread"<<endl;
}
//close(connfd);
}
close(serverFd);
return ;
}
客户端代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<string.h>
#include<errno.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h> #define SERVERIP "192.168.1.117"
#define SERVERPORT 12345
#define MAXBUFFER 256 int main(int argc,char** argv)
{
int clientFd,ret;
struct sockaddr_in serveraddr;
char buf[MAXBUFFER];
clientFd=socket(AF_INET,SOCK_STREAM,);//创建socket
if(clientFd<)
{
printf("socket error:%s \n",strerror(errno));
exit(-);
} bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(SERVERPORT);
inet_pton(AF_INET,SERVERIP,&serveraddr.sin_addr); //连接到服务器
ret=connect(clientFd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); if(ret!=)
{
close(clientFd);
printf("connect error:%s \n",strerror(errno));
exit(-);
}
while()
{
bzero(buf,sizeof(buf));
scanf("%s",buf);
write(clientFd,buf,sizeof(buf));//写数据
bzero(buf,sizeof(buf));
read(clientFd,buf,sizeof(buf));//读数据
printf("echo:%s\n",buf);
}
close(clientFd);
return (EXIT_SUCCESS); }
再次提醒,编译时,在后面加上-lpthread。例如:g++ service2.cpp -o service2 -lpthread。否则会提示线程方面的错误。
如有转载,请注明出处,谢谢!
Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,是网络编程的“Hello World!”的更多相关文章
- Android BLE与终端通信(四)——实现服务器与客户端即时通讯功能
Android BLE与终端通信(四)--实现服务器与客户端即时通讯功能 前面几篇一直在讲一些基础,其实说实话,蓝牙主要为多的还是一些概念性的东西,当你把概念都熟悉了之后,你会很简单的就可以实现一些逻 ...
- java 网络编程 TCP协议 java 服务器和客户端 java socket编程
一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程: 先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客 ...
- netty入坑第一步:了解netty和编写简单的Echo服务器和客户端
早期java API通过原生socket产生所谓的"blocking",大致过程是这样 这种的特点是每次只能处理一个请求,如果要实现多个请求并行,就还要分配一个新的线程来给每个客户 ...
- python web编程-CGI帮助web服务器处理客户端编程
这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里 ...
- Linux下基于多线程的echo
准备开始写一些Linux 下网络编程以及多线程的blog,就从这个简单的echo程序开始吧. 在echo的服务端使用多线程与客户进行通信,可以实现一个服务端程序同时连接多个客户的功能.那么,到底在服务 ...
- python echo服务器和客户端(客户端可以用telnet之类的)
发上来记录一下,省得下次再写一遍 服务器:server.py #-*- coding:utf-8 -*- from SocketServer import TCPServer, BaseRequest ...
- 02_Netty实现的Echo服务器和客户端
[Echo服务端] [EchoServer] public class EchoServer { private final int port; public EchoServer(int port) ...
- 一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)
1.目的:实现客户端向服务器发送数据 原理: 2.建立两个控制台应用,一个为服务器,用于接收数据.一个为客户端,用于发送数据. 关键类与对应方法: 1)类IPEndPoint: 1.是抽象类EndPo ...
- 网络编程-echo服务器
代码: #coding="utf-8" #name=echo服务器 from socket import * #1.创建套接字 udpSocket = socket(AF_INET ...
随机推荐
- 使用像素单位设置 EXCEL 列宽或行高
在导出 Excel 的时候, 经常要需要给列设置宽度或给行设置高度, 在使用 NPOI 或 EppPlus 等组件进行操作的时候, 列宽和行高的单位都不是像素, 好像是英寸,具体是啥也说不清. 平常在 ...
- Python----一些面试题
1.写出以下结果 print(1<2 and 2==2) print(1<2 and 2==1) print(1>2 and 2==2) 结果: True False False 解 ...
- ClamAV学习【2】——clamscan入口函数浏览
就简单给代码加上些注释,方便理解.第一次浏览,应该会有不正确的理解.后面会继续学习修改. 文件:clamscan\clamscan.c 代码如下: nt main(int argc, char **a ...
- Mybatis 动态Sql语句《常用》
MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...
- wpa2破解代码思路(教你写poc)
前言:此篇关于1.wpa2协议漏洞的产生原因:2.scapy这个数据包库的基础:3.最后讲解代码思路,让你们从伪代码可以直接写成代码展开介绍分享~ 本文作者:i春秋签约作家——kaikaix 1.大家 ...
- apollo配置中心初探
近在搞微服务框架的开发,需要有一个配置中心来满足统一管理业务应用以及组件的配置,在此期间也使用了多个配置中心比如:spring cloud config,自研的配置中心,当然还有apollo. spr ...
- 读取图片信息(exif),使用com.drew.metadata.Metadata
---恢复内容开始--- 最近在开发中用到了metadata-extractor-xxx.jar 和 xmpcore-xxx.jar这个玩意, 索性查阅大量文章了解学习,来分享分享.本身工作也是经常和 ...
- Leetcode 98 验证二叉搜索树 Python实现
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...
- isUserAMonkey? android真逗
QA报了个问题,说是无线热点下面的开关都没了,看了看代码,原来这是android的保护机制. 在涉及到用户信息的功能上,android会通过ActivityManagerNative.isUserAM ...
- JavaScript变量那些事
引言 JavaScript的变量本质是松散类型的,也就是说其变量就是用于保存特定值的一个名字,变量的值和数据类型可以在脚本执行的生命周期中发生变化.这是一个很有趣很强大的特性,但是也是一个极容易出错误 ...