- 论坛徽章:
- 0
|
服务端逻辑:
使用本地sock(绑定文件的,STREAM), 接收字符串, 返回字符串, 关闭连接
客户端逻辑:
主动连接服务端,发送字符串,接收字符串,关闭连接, 重新连接服务端,无限循环
问题:
accept只能触发一次。 就是当客户端第一次建立连接时,accept事件和read事件都能正常返回。 当客户端第二次连接时,accept事件就不会返回了
问:
accept事件需要每次用完,再重新添加进base吗? 怎样重新添加呢? 先event_free或者event_del,然后再add吗?
服务端- #include "task.h"
- struct event_base *TaskReadEvBase;
- void TaskReadEvFun(int sd, short event, void *arg);
- void *ReadTaskEvThead(void *arg){
- TaskListenPort *ListenPort=(TaskListenPort *)arg;
- struct event *TaskReadEv=NULL;
- TaskReadEvBase=event_base_new();
- TaskReadEv=event_new(TaskReadEvBase, ListenPort->sd, EV_READ|EV_PERSIST, TaskAcceptEvFun, (void *)TaskReadEv);
- if(TaskReadEv==NULL){
- perror("event_new");
- pthread_exit(NULL);
- }
- event_add(TaskReadEv, NULL);
- event_base_dispatch(TaskReadEvBase);
- printf("event_base_dispatch over");
- pthread_exit(NULL);
- }
- void TaskReadEvFun(int sd, short event, void *arg){
- int len=0;
- char buf[256];
- struct event *TaskReadEv=(struct event *)arg;
-
- printf("==================\n");
- printf("sd=%d\n", sd);
- bzero(buf, 256);
- len=recv(sd, buf, 256, 0);
- printf("recvbuf=%s\n", buf);
- write(sd, "over\n", 5);
- perror("write");
- printf("sd=%d\n", event_get_fd(TaskReadEv));
- close(event_get_fd(TaskReadEv));
- event_free(TaskReadEv);
- return;
- }
- void TaskAcceptEvFun(int sd, short event, void *arg){
- int newsd=0;
- struct sockaddr_un addr;
- socklen_t isinsize=0;
- struct event *TaskReadEv=NULL;
- struct event *TaskAcceptEv=(struct event *)arg;
-
- printf("accept event\n");
- newsd = accept(sd, (struct sockaddr *)&addr, &isinsize);
- if(newsd==-1){
- printf("TaskAcceptEvFun error\n");
- perror("accept");
- return;
- }
- evutil_make_socket_nonblocking(newsd);
- TaskReadEv=event_new(TaskReadEvBase, newsd, EV_READ|EV_PERSIST, TaskReadEvFun, (void *)TaskReadEv);
- if(TaskReadEv==NULL){
- perror("event_new error\n");
- return;
- }
- event_add(TaskReadEv, NULL);
- //event_add(TaskAcceptEv, NULL);
- }
- int init_task_listen(TaskListenPort *port){
- int sd=0, ret=0;
- struct sockaddr_un addr;
- sd=socket(PF_UNIX, SOCK_STREAM, 0);
- if(sd==-1){
- perror("socket");
- remove(port->portfile);
- return ERR;
- }
-
- evutil_make_socket_nonblocking(sd);
-
- addr.sun_family=AF_UNIX;
- strncpy(addr.sun_path, port->portfile, sizeof(addr.sun_path)-1);
- ret=bind(sd, (struct sockaddr *)&addr, sizeof(addr));
- if(ret==-1){
- perror("bind");
- close(sd);
- return ERR;
- }
- ret=listen(sd, 256);
- if(ret==-1){
- perror("listen");
- close(sd);
- return ERR;
- }
- return sd;
- }
复制代码 客户端- //c_unix.c
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/un.h>
- #define UNIX_DOMAIN "/tmp/dataswsmb.port"
- int main(void)
- {
- int connect_fd;
- int ret;
- char snd_buf[128];
- int i;
- while(1)
- {
- static struct sockaddr_un srv_addr;
- connect_fd=socket(PF_UNIX,SOCK_STREAM,0);
- if(connect_fd<0)
- {
- perror("cannot create communication socket");
- return 1;
- }
- srv_addr.sun_family=AF_UNIX;
- strcpy(srv_addr.sun_path,UNIX_DOMAIN);
- ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
- if(ret==-1)
- {
- perror("cannot connect to the server");
- close(connect_fd);
- return 1;
- }
- perror("connect");
- memset(snd_buf,0x00,128);
- strcpy(snd_buf,"message from client");
- ret = write(connect_fd,snd_buf,sizeof(snd_buf));
- if (ret <= 0)
- {
- perror("write");
- }
- perror("write");
- memset(snd_buf,0x00,128);
- ret = read(connect_fd,snd_buf,sizeof(snd_buf));
- if (ret <= 0)
- {
- perror("read");
- }
- perror("read");
- printf("server returned : %s\n", snd_buf);
- close(connect_fd);
- printf("=================================\n");
- }
- return 0;
- }
复制代码 |
|