该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最近在学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;
}
求大神带带我。。。。。。。。。。。。