#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多线程"时,我们关注的是如何在Delphi 7环境下利用Socket进行并发处理,即通过多线程技术来实现多个Socket连接同时操作。 首先,让我们理解Socket的基本概念。Socket是网络通信中的一个...
本文将深入探讨如何在Delphi编程环境中使用Socket进行多线程通信,以实现更高效、更灵活的应用程序。 首先,我们需要了解什么是Socket。Socket是网络通信中的一个抽象概念,它代表了两个端点之间的连接,允许应用...
2. **TEvent对象**:可以用来在多个线程之间同步操作,避免资源竞争。 五、调试多线程 1. **Breakpoints**:在Delphi中,可以在多线程的代码中设置断点,调试器会暂停相应线程的执行,以便检查变量值和执行流程。 2...
官方离线安装包,亲测可用
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
teventteventteventteventtevent
这个“Delphi经典的多线程DEMO”很可能是为了演示如何在Delphi中实现并管理多线程应用。 在Delphi中,我们可以使用TThread类来创建和管理线程。TThread是VCL(Visual Component Library)框架中的一个基础类,它为...
**Delphi多线程详解** Delphi是一种强大的Object Pascal编程环境,它提供了丰富的工具和库来支持多线程编程,使开发者能够充分利用多核处理器的性能,提高应用程序的响应速度和执行效率。本文将深入探讨Delphi中的...
在这个“多线程Demo”中,我们关注的是如何在Delphi 2010环境下实现多线程功能。Delphi,作为一款强大的RAD(快速应用开发)工具,提供了丰富的库支持,使得开发者可以方便地创建并发应用程序。 首先,我们要理解...
在"A线程同步DEMO"的示例中,你可能会看到如何在多个线程中定义和使用TCriticalSection来保护共享资源。每个线程在访问共享数据前都会调用EnterCriticalSection,然后在完成操作后调用LeaveCriticalSection。这样就...
但我可以基于标题中提到的“基于Delphi多线程技术的数据下载”这一概念,详细说明Delphi中多线程技术以及如何应用于数据下载的知识点。 Delphi是一种支持快速应用程序开发的集成开发环境(IDE),它提供了丰富的...
官方离线安装包,亲测可用
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用
离线安装包,亲测可用
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用
官方离线安装包,亲测可用
官方离线安装包,亲测可用