Linux下实现基于多线程的echo程序

准备开始写一些Linux 下网络编程以及多线程的blog,就从这个简单的echo程序开始吧。

在echo的服务端使用多线程与客户进行通信,可以实现一个服务端程序同时连接多个客户的功能。那么,到底在服务端要有多少个线程呢?

答案是:1+1+n。一个主线程,一个监听(listen)线程,与n个客户进行通信的n个线程。

服务端代码:

#include "../unp.h"
#include <pthread.h>

void* str_echo(void* argv)
{
    int *pcommu = (int*)argv;
    int sockfd =*pcommu;

    ssize_t n;
    char buf[MAXLINE];

    while ( (n = read(sockfd,buf,MAXLINE)) > 0) {
        write(sockfd,buf,n);
    }
}

void* listen_func(void* argv)
{
    int* plistenfd = (int*)argv;
    int listenfd = *plistenfd;

    listen(listenfd,LISTENQ);
    for (;;) {
        struct sockaddr_in cliaddr;
        socklen_t clilen = sizeof(cliaddr);
            int connfd = accept(listenfd,(SA*)&cliaddr,&clilen);
        pthread_t communication;//通信线程
        pthread_create(&communication,NULL,&str_echo,&connfd);
    }
}

int main()
{
    int listenfd;

    struct sockaddr_in servaddr;

    listenfd = socket(AF_INET,SOCK_STREAM,0);

    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,(SA*)&servaddr,sizeof(servaddr));

    pthread_t listenPthread;//监听线程
    pthread_create(&listenPthread,NULL,&listen_func,&listenfd);

    while(1);

    return 0;
}

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/OS/Linux/

客户端代码:

#include "../unp.h"

void str_cli(FILE *fp, int sockfd);
int main(int argc, char **argv)
{
    int sockfd;
    struct sockaddr_in servaddr,cliaddr;
    if (argc != 2) {
        printf("no IPaddress\n");
        return 0;
    }

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET, argv[1],&servaddr.sin_addr);

    connect(sockfd, (SA*) &servaddr, sizeof(servaddr));

    str_cli(stdin,sockfd);

    exit(0);
}

void str_cli(FILE *fp, int sockfd)
{
    char sendline[MAXLINE],recvline[MAXLINE];
    int n;
    while (fgets(sendline,MAXLINE,fp) != NULL) {
        write(sockfd, sendline, strlen(sendline));

        if(n = read(sockfd, recvline, MAXLINE) ) {
            recvline[n] = 0;
            fputs(recvline, stdout);
        }
    }
}

ps,之前在看UNP,客户端代码是UNP里面的。我主要是把UNP里面的服务端的程序改成了多线程的,在原书里是基于多进程的,这样的话服务端一旦运行就堵塞在监听那,改成多线程,单独拿出一个线程来监听可以解决这种情况,主线程可以去做其他的操作,而不会阻塞在listen  :)。

pps,我在github上放了一个即时聊天的小程序,服务端也是基于多线程的,不过是window下的,而且用的原始的socket api,准备有时间改成linux+muduo库,感兴趣请戳:github地址

作者:cnblogs NicGanon

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 线程
, 多线程
, 监听
, 服务
, inet pton
, sockfd
linux下多线程
linux实现多线程、linux 多线程的实现、linux多线程程序设计、linux 多线程程序、linux 编写程序实现cp,以便于您获取更多的相关知识。

时间: 2016-11-25

Linux下实现基于多线程的echo程序的相关文章

Linux下C语言多线程,网络通信简单聊天程序

原文:Linux下C语言多线程,网络通信简单聊天程序 功能描述:程序应用多线程技术,可是实现1对N进行网络通信聊天.但至今没想出合适的退出机制,除了用Ctr+C.出于演示目的,这里采用UNIX域协议(文件系统套接字),程序分为客户端和服务端.应用select函数来实现异步的读写操作. 先说一下服务端:首先先创建套接字,然后绑定,接下进入一个无限循环,用accept函数,接受"连接"请求,然后调用创建线程函数,创造新的线程,进入下一个循环.这样每当有一个新的"连接"被

linux下C语言多线程编程实例

linux下C语言多线程编程实例 学东西,往往实例才是最让人感兴趣的,老是学基础理论,不动手,感觉没有成就感,呵呵. 下面先来一个实例.我们通过创建两个线程来实现对一个数的递加. 或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉. 下面是我们的代码: /*thread_example.c : c multiple thread programming in linux *author : falcon *E-mail : [email protected]

lnav:Linux下一个基于控制台的高级日志文件查看器

服务器日志是一个由服务器创建并经常更新.用于抓取特定服务和应用的所有活动信息的日志文件.当你的应用或者服务出现问题时这个文件就会非常有用.从日志文件中你可以获取所有关于该问题的信息,例如基于警告或者错误信息它什么时候开始表现不正常. LNAV(Log file Navigator)是 Linux 下一个基于控制台的高级日志文件查看器.它和其它文件查看器,例如 cat.more.tail 等,完成相同的任务,但有很多普通文件查看器没有的增强功能(尤其是它自带多种颜色和易于阅读的格式). 它能在解压

lnav:Linux 下一个基于控制台的高级日志文件查看器

服务器日志是一个由服务器创建并经常更新.用于抓取特定服务和应用的所有活动信息的日志文件.当你的应用或者服务出现问题时这个文件就会非常有用.从日志文件中你可以获取所有关于该问题的信息,例如基于警告或者错误信息它什么时候开始表现不正常. LNAV(Log file Navigator)是 Linux 下一个基于控制台的高级日志文件查看器.它和其它文件查看器,例如 cat.more.tail 等,完成相同的任务,但有很多普通文件查看器没有的增强功能(尤其是它自带多种颜色和易于阅读的格式). 它能在解压

char-VS2010下编写基于TCP的网络应用程序运行出现乱码,一堆“烫”字,求高手救命

问题描述 VS2010下编写基于TCP的网络应用程序运行出现乱码,一堆"烫"字,求高手救命 客户端:#include #include #pragma comment(libws2_32.lib"")void main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1 1 );err = WSAStartup( wVersionRequested

Linux 下编译c++ opengl的小程序

问题描述 Linux 下编译c++ opengl的小程序 完整的代码如下 #include <GL/glut.h> #include <cmath> #include <utility> #include <vector> using std::vector; using std::pair; vector<pair<int, int> > my_points(4); vector<pair<int, int> &g

在Linux下的SSH端口转发的程序

  在Linux系统中的SSH端口转发,有很多种的转发操作,而且还是一种很好用的关于端口使用的程序,所以今天我们就来了解下关于SSH端口转发具体内容吧! 通常情况下两个不同的网络之间总会开放某一些特定的端口用于通讯使用,而SSH所使用的22端口通常就在开放之列.基于SSH的端口转发就是利用SSH作为中间的代理,达到绕过两个网络之间的限制,顺利的进行任意的端口的访问. 端口转发可以分为三种: 正向端口转发; 反向端口转发; 动态端口转发. 为了演示这三种端口转发方式的用法我们先假设存在有2个网域O

深入理解linux下rc.d/目录文件以及程序开机自启动

由于我日常开发使用的是fedora9,所以,就已fedora9为例.    [[email protected] rc.d]# pwd /etc/rc.d [[email protected] rc.d]# ls init.d rc0.d rc2.d rc4.d rc6.d rc.sysinit rc rc1.d rc3.d rc5.d rc.local 其中,x.d为目录,其他的均为脚本可执行文件. 在讲述这几个目录以及文件的作用及关系之前,我们需要了解linux(RedHat系列)的启动顺序.

Linux下使用Eclipse开发C/C++程序

相信好多人和我一样困惑,在网上查各种安装配置方法,可是试了所有的方法也还是没有成功,其实,这 个并不能怪网上的方法不对,可能只是你没有点击一个键的原因,下面,我就来讲下怎样使用Eclipse开发 C/C++程序. 首先,你需要安装JDK,这个没什么好说的,因为,方法和步骤实在是太多了,那么,我 就不在这废话了. 接下来,你需要去elcipse官网下载Eclipse IDE for C/C++ Developers,下载的地 址:http://www.eclipse.org/downloads/,