在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!”的更多相关文章

  1. Android BLE与终端通信(四)——实现服务器与客户端即时通讯功能

    Android BLE与终端通信(四)--实现服务器与客户端即时通讯功能 前面几篇一直在讲一些基础,其实说实话,蓝牙主要为多的还是一些概念性的东西,当你把概念都熟悉了之后,你会很简单的就可以实现一些逻 ...

  2. java 网络编程 TCP协议 java 服务器和客户端 java socket编程

    一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程:        先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客 ...

  3. netty入坑第一步:了解netty和编写简单的Echo服务器和客户端

    早期java API通过原生socket产生所谓的"blocking",大致过程是这样 这种的特点是每次只能处理一个请求,如果要实现多个请求并行,就还要分配一个新的线程来给每个客户 ...

  4. python web编程-CGI帮助web服务器处理客户端编程

    这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里 ...

  5. Linux下基于多线程的echo

    准备开始写一些Linux 下网络编程以及多线程的blog,就从这个简单的echo程序开始吧. 在echo的服务端使用多线程与客户进行通信,可以实现一个服务端程序同时连接多个客户的功能.那么,到底在服务 ...

  6. python echo服务器和客户端(客户端可以用telnet之类的)

    发上来记录一下,省得下次再写一遍 服务器:server.py #-*- coding:utf-8 -*- from SocketServer import TCPServer, BaseRequest ...

  7. 02_Netty实现的Echo服务器和客户端

    [Echo服务端] [EchoServer] public class EchoServer { private final int port; public EchoServer(int port) ...

  8. 一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)

    1.目的:实现客户端向服务器发送数据 原理: 2.建立两个控制台应用,一个为服务器,用于接收数据.一个为客户端,用于发送数据. 关键类与对应方法: 1)类IPEndPoint: 1.是抽象类EndPo ...

  9. 网络编程-echo服务器

    代码: #coding="utf-8" #name=echo服务器 from socket import * #1.创建套接字 udpSocket = socket(AF_INET ...

随机推荐

  1. Sqler-Cmd

    针对于sqler 工具cmd 部分 做了如下整理 1 Cluster Model 2 Regedit Model $servers= '192.168.25.xx','192.168.25.yy' W ...

  2. CDI(Weld)高级<4> Event(事件) (转)

    目录[-] 1. Event payload(事件的有效载入) 2. Event observers(event的观察者) 3. Event producers(event生产者) 4.Annotat ...

  3. Session如何保存在sql数据库中

    aspnet中,session默认以inproc模式存储,也就是保存在iis进程中,这样有个优点就是效率高,但不利于为本负载均衡扩展.可以把session信息保存在SQL Server中,据说,该种方 ...

  4. angular响应式表单 - 状态字段

    用于表单验证的过程: touched,untoched pristine,dirty pending

  5. Programmatically Disable Event Firing on List Item Update in SharePoint 2010

    1. Microsoft.SharePoint.dll Create EventFiring.cs 1.Right-click on the project, select Add and click ...

  6. JPA之@GeneratedValue注解

    JPA的@GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键), ...

  7. 【题解】 UVa11210 Chinese Mahjong

    pdf传送门 直接模拟+搜索,考虑一下选哪一个是将,然后搜出顺子和刻子,最后判断一下可不可行就好了! #include<stdio.h> #include<string.h> ...

  8. Android 内存管理研究

    1. 内存管理基础知识 http://www.cnblogs.com/xingfuzzhd/p/3485924.html 1. mImageView.setImageResource(R.drawab ...

  9. ActionBarSherlock(一)在Eclipse中如何引入ActionBarSherlock和它的例子?

    ActionBarSherlock,是一个开源的Actionbar项目(http://actionbarsherlock.com/download.html).为什么我们要用它呢?谷歌已经不强制要求厂 ...

  10. php-fpm 和 nginx 的两种通信方式

    在 linux 中,nginx 服务器和 php-fpm 可以通过 tcp socket 和 unix socket 两种方式实现. 一下内容转自:https://blog.csdn.net/qq62 ...