`
暴风雪
  • 浏览: 390344 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

基于tevent的socket多路复用demo

    博客分类:
  • C艹
 
阅读更多
#include <stdio.h>
#include <unistd.h>
#include <talloc.h>
#include <tevent.h>
#include <sys/time.h>
#include <fcntl.h>
#include <tevent_internal.h>
#include<arpa/inet.h>

#define MAXLEN 1024
#define SERV_PORT 4380
#define MAX_OPEN_FD 1024

struct state {
     TALLOC_CTX *ctx;
     int my_fd,fd2[10];
     int conn_num;
     struct sockaddr_in cliaddr,servaddr;
     struct tevent_fd* fde[10];
     struct tevent_context *ev;
};

static void ctdb_tevent_trace(enum tevent_trace_point tp,
			      void *private_data)
{
	int now,diff;

        time_t t = time(NULL);
	now = time(&t);

	switch (tp) {
	case TEVENT_TRACE_BEFORE_WAIT:
		//diff = now-tevent_after_wait_ts;
		//printf("\tHandling event took %ld seconds!\n",
		//       (long)diff);
		//tevent_before_wait_ts = now;
		break;

	case TEVENT_TRACE_AFTER_WAIT:
		//diff = now-tevent_before_wait_ts;
	        //printf("\tNo event for %ld seconds!\n",
		//       (long)diff);
		//tevent_after_wait_ts = now;
		break;

	default:
                printf("\n")
		/* Do nothing for future tevent trace points */ ;
	}
}

static void handler2(struct tevent_context *ev,
                           struct tevent_fd *fde,
                           uint16_t flags,
                           void *private_data)
{
    struct state *data = talloc_get_type_abort(private_data, struct state);
    int j;
    if (flags & TEVENT_FD_READ) {
        char buf[10000];
        int bytes = read(fde->fd,buf,MAXLEN);
        if(bytes == 0){
            close(fde->fd);
            return;
        }
        for (j = 0; j < bytes; ++j)
        {
            buf[j] = toupper(buf[j]);
        }
        printf("recieve_%s\n",buf);
        write(fde->fd,buf,bytes);
    }

}

static void handler(struct tevent_context *ev,
                           struct tevent_fd *fde,
                           uint16_t flags,
                           void *private_data)
{
    struct state *data = talloc_get_type_abort(private_data, struct state);
    struct tevent_fd* fd_event = NULL;
    struct sockaddr_in cliaddr;

    socklen_t clilen = sizeof(cliaddr);
    data->fd2[data->conn_num] = accept(data->my_fd,(struct sockaddr*)&cliaddr,&clilen);
    if (data->fd2[data->conn_num]== -1) {
        return;
    }
    printf("get_accepted\n");
    data->fde[data->conn_num] = tevent_add_fd(data->ev,
                            data,
                            data->fd2[data->conn_num],
                            TEVENT_FD_READ,
                            handler2,
                            data);
    tevent_fd_set_auto_close(data->fde[data->conn_num]);
    data->conn_num++;
}

int main(void)  {
    struct tevent_context *event_ctx;
    TALLOC_CTX *mem_ctx = talloc_new(NULL); // parent
    event_ctx = tevent_context_init(mem_ctx);
    struct state *data = talloc(mem_ctx, struct state);
    data->ctx = mem_ctx;
    data->conn_num = 0;
    struct tevent_fd* fd_event = NULL;


    int  connfd,efd,ret;
    char buf[MAXLEN];
    struct sockaddr_in cliaddr,servaddr;
    socklen_t clilen = sizeof(cliaddr);

    data->my_fd = socket(AF_INET,SOCK_STREAM,0);

    data->ev= event_ctx;
    data->servaddr.sin_family = AF_INET;
    data->servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    data->servaddr.sin_port = htons(SERV_PORT);
    bind(data->my_fd,(struct sockaddr*)&(data->servaddr),sizeof(data->servaddr));
    listen(data->my_fd,30);

    fd_event = tevent_add_fd(event_ctx,
                                     data,
                                     data->my_fd,
                                     TEVENT_FD_READ,
                                     handler,
                                     data);

    printf("flags\t%u\n",fd_event->flags);
    printf("TEVENT_FD_READ\t%u\n",TEVENT_FD_READ);
    tevent_loop_wait(event_ctx);
    talloc_free(mem_ctx);
    return EXIT_SUCCESS;
}

 

分享到:
评论

相关推荐

    delphi7 socket多线程

    当我们谈论"Delphi7 Socket多线程"时,我们关注的是如何在Delphi 7环境下利用Socket进行并发处理,即通过多线程技术来实现多个Socket连接同时操作。 首先,让我们理解Socket的基本概念。Socket是网络通信中的一个...

    socket多线程 简单的socket应用

    本文将深入探讨如何在Delphi编程环境中使用Socket进行多线程通信,以实现更高效、更灵活的应用程序。 首先,我们需要了解什么是Socket。Socket是网络通信中的一个抽象概念,它代表了两个端点之间的连接,允许应用...

    delphi 多线程调试demo

    2. **TEvent对象**:可以用来在多个线程之间同步操作,避免资源竞争。 五、调试多线程 1. **Breakpoints**:在Delphi中,可以在多线程的代码中设置断点,调试器会暂停相应线程的执行,以便检查变量值和执行流程。 2...

    libverto-tevent-devel-0.2.5-4.el7.x86_64.rpm

    官方离线安装包,亲测可用

    python-tevent-0.9.39-1.el7.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    teventteventteventteventtevent

    teventteventteventteventtevent

    Delphi经典的多线程DEMO

    这个“Delphi经典的多线程DEMO”很可能是为了演示如何在Delphi中实现并管理多线程应用。 在Delphi中,我们可以使用TThread类来创建和管理线程。TThread是VCL(Visual Component Library)框架中的一个基础类,它为...

    Delphi多线程详细介绍

    **Delphi多线程详解** Delphi是一种强大的Object Pascal编程环境,它提供了丰富的工具和库来支持多线程编程,使开发者能够充分利用多核处理器的性能,提高应用程序的响应速度和执行效率。本文将深入探讨Delphi中的...

    多线程Demo

    在这个“多线程Demo”中,我们关注的是如何在Delphi 2010环境下实现多线程功能。Delphi,作为一款强大的RAD(快速应用开发)工具,提供了丰富的库支持,使得开发者可以方便地创建并发应用程序。 首先,我们要理解...

    A线程同步DEMO

    在"A线程同步DEMO"的示例中,你可能会看到如何在多个线程中定义和使用TCriticalSection来保护共享资源。每个线程在访问共享数据前都会调用EnterCriticalSection,然后在完成操作后调用LeaveCriticalSection。这样就...

    基于Delphi多线程技术的数据下载.pdf

    但我可以基于标题中提到的“基于Delphi多线程技术的数据下载”这一概念,详细说明Delphi中多线程技术以及如何应用于数据下载的知识点。 Delphi是一种支持快速应用程序开发的集成开发环境(IDE),它提供了丰富的...

    libverto-tevent-0.2.5-4.el7.i686.rpm

    官方离线安装包,亲测可用

    libverto-tevent-0.2.5-4.el7.i686.rpm.zip

    文件放服务器下载,请务必到电脑端资源预览或者资源详情查看然后下载

    python3-tevent-0.10.2-2.el8.aarch64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    python3-tevent-0.11.0-0.el8.aarch64.rpm

    官方离线安装包,亲测可用

    libverto-tevent-0.2.5-4.el7.x86_64.rpm

    离线安装包,亲测可用

    python-tevent-0.9.39-1.el7.x86_64.rpm.zip

    文件放服务器下载,请务必到电脑端资源预览或者资源详情查看然后下载

    libverto-tevent-0.2.5-4.el7.x86_64.rpm.zip

    文件放服务器下载,请务必到电脑端资源预览或者资源详情查看然后下载

    python3-tevent-0.10.2-2.el8.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    python3-tevent-0.10.2-2.el8.ppc64le.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

Global site tag (gtag.js) - Google Analytics