linux 本地套接字 效率,求助:Linux本地域套接字和epoll的问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

最近在学linux编程。想用套接字在进程间传信息,编译成功了但测试端找不到serc。

代码如下,借鉴别人的改的,检测不到事件:

//serc.c

#include

#include

#include

#include

#include

#include

#include

#include

#define SERVER_NAME "@Banana"

void addfd(int epollfd,int fd)

{

struct epoll_event event;

event.data.fd=fd;

event.events=EPOLLIN|EPOLLET;

epoll_ctl(epollfd,EPOLL_CTL_ADD,fd,&event);

fcntl(fd,F_SETFL,fcntl(fd,F_GETFL)|O_NONBLOCK);

}

int main()

{

int listen_fd,com_fd,ret,i,selectfd,serverlen;

static char recv_buf[1024];

int epollfd=epoll_create(5);

struct sockaddr_un srv_addr;

do

{

listen_fd=socket(AF_UNIX,SOCK_STREAM,0);

if(listen_fd<0){perror("create socket failure");break;}

srv_addr.sun_family=AF_UNIX;

strncpy(srv_addr.sun_path,SERVER_NAME,sizeof(srv_addr.sun_path)-1);

printf("%s\n",srv_addr.sun_path);

srv_addr.sun_path[0]=0;

serverlen = strlen(SERVER_NAME)+offsetof(struct sockaddr_un, sun_path);

unlink(SERVER_NAME);

ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));

if(ret==-1){perror("Bind failure");break;}

ret=listen(listen_fd,1);

if(ret==-1){perror("Listen failure");break;}

struct epoll_event events[1024];

if(epollfd==-1){perror("create epoll failure");break;}

addfd(epollfd,listen_fd);

while(1)

{

int number=epoll_wait(epollfd,events,1024,-1);

if(number<0){perror("epoll failure");break;}

printf("epoll read\n");

for(i=0;i

{

selectfd=events[i].data.fd;

if(selectfd==listen_fd)

{

struct sockaddr_un clt_addr;

int len=serverlen;

int connfd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);

addfd(epollfd,connfd);

}

else if(events[i].events&EPOLLIN)

{

while(1)

{

memset(recv_buf,0,1024);

ret=read(com_fd,recv_buf,sizeof(recv_buf));

if(ret<0)

{

if((errno==EAGAIN)||(errno==EWOULDBLOCK))

break;

close(selectfd);

break;

}

else if(ret==0)

close(selectfd);

else

printf("Message:%s\n",recv_buf);

}

}

else

printf("Something Happened");

}

}

}while(0);

close(com_fd);

close(listen_fd);

unlink(SERVER_NAME);

return 0;

}

//clic.c:

#include

#include

#include

#include

#include

#define UNIX_DOMAIN "@Banana"

int main(void)

{

int connect_fd;

int ret;

char snd_buf[1024];

int i,srvaddr;

static struct sockaddr_un srv_addr;

connect_fd=socket(AF_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);

strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);

srv_addr.sun_path[0]=0;

srvaddr=strlen(SERVER_NAME)+offsetof(struct sockaddr_un, sun_path);

unlink(UNIX_DOMAIN);

ret=connect(connect_fd,(struct sockaddr*)&srv_addr,srvaddr);

if(ret==-1)

{

perror("cannot connect to the server");

close(connect_fd);

return 1;

}

memset(snd_buf,0,1024);

strcpy(snd_buf,"message from client");

//send info server

for(i=0;i<4;i++)

write(connect_fd,snd_buf,sizeof(snd_buf));

close(connect_fd);

return 0;

}

但是对于如下的程序,测试连接成功了,而且可以和上面的serc并存:

//ser.c

#include

#include

#include

#include

#define SERVER_NAME "@Banana

int main(void)

{

// socklen_t clt_addr_len;

int listen_fd,com_fd,ret,i,len;

static char recv_buf[1024];

struct sockaddr_un clt_addr;

len=sizeof(clt_addr);

struct sockaddr_un srv_addr;

listen_fd=socket(AF_UNIX,SOCK_STREAM,0);

if(listen_fd<0)

{

perror("cannot create communication socket");

return 1;

}

srv_addr.sun_family=AF_UNIX;

strncpy(srv_addr.sun_path,SERVER_NAME,sizeof(srv_addr.sun_path)-1);

printf("%s\n",srv_addr.sun_path);

srv_addr.sun_path[0]=0;

unlink(SERVER_NAME);

ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));

if(ret==-1)

{

perror("cannot bind server socket");

close(listen_fd);

unlink(SERVER_NAME);

return 1;

}

//listen sockfd

ret=listen(listen_fd,1);

if(ret==-1)

{

perror("cannot listen the client connect request");

close(listen_fd);

unlink(SERVER_NAME);

return 1;

}

//have connect request use accept

com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);

if(com_fd<0)

{

perror("cannot accept client connect request");

close(listen_fd);

unlink(SERVER_NAME);

return 1;

}

//read and printf sent client info

printf("/n=====info=====/n");

for(i=0;i<4;i++)

{

memset(recv_buf,0,1024);

int num=read(com_fd,recv_buf,sizeof(recv_buf));

printf("Message from client (%d)) :%s/n",num,recv_buf);

}

close(com_fd);

close(listen_fd);

unlink(SERVER_NAME);

return 0;

}

求大神带带我。。。。。。。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值