问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux编程问题,有关本地域套接字和EPOLL的

发布网友 发布时间:2022-05-01 15:10

我来回答

1个回答

热心网友 时间:2023-10-21 00:09

我写的一个可运行的本地域socket的例子,监听端的服务地址为绝对路径。例如/tmp/ssss.socket
void *lfs_dispatcher_thread_fn (void *arg)
{
struct sockaddr_in clientaddr;
int fdmax;
int newfd;
char buf[1024];
int nbytes;
int addrlen;
int ret;
int epfd = -1;
int res = -1;
struct epoll_event ev;
int index = 0;
int listen_fd, client_fd = -1;
struct sockaddr_un srv_addr;

listen_fd = socket (AF_UNIX, SOCK_STREAM, 0);
if (listen_fd < 0)
{
perror ("cannot create listening socket");
}
else
{
srv_addr.sun_family = AF_UNIX;
strncpy (srv_addr.sun_path, UNIX_DOMAIN,
sizeof (srv_addr.sun_path) - 1);
unlink (UNIX_DOMAIN);
ret =
bind (listen_fd, (struct sockaddr *) &srv_addr,
sizeof (srv_addr));
if (ret == -1)
{
lfs_printf ("cannot bind server socket");
lfs_printf ("srv_addr:%p", &srv_addr);
close (listen_fd);
unlink (UNIX_DOMAIN);
exit (1);
}
}

ret = listen (listen_fd, 1);
if (ret == -1)
{
perror ("cannot listen the client connect request");
close (listen_fd);
unlink (UNIX_DOMAIN);
exit (1);
}
chmod (UNIX_DOMAIN, 00777);//设置通信文件权限

fdmax = listen_fd;/* so far, it's this one */

events = calloc (MAX_CON, sizeof (struct epoll_event));
if ((epfd = epoll_create (MAX_CON)) == -1)
{
perror ("epoll_create");
exit (1);
}
ev.events = EPOLLIN;
ev.data.fd = fdmax;
if (epoll_ctl (epfd, EPOLL_CTL_ADD, fdmax, &ev) < 0)
{
perror ("epoll_ctl");
exit (1);
}
//time(&start);
for (;;)
{
res = epoll_wait (epfd, events, MAX_CON, -1);
client_fd = events[index].data.fd;
for (index = 0; index < MAX_CON; index++)
{
if (client_fd == listen_fd)
{
addrlen = sizeof (clientaddr);
if ((newfd =
accept (listen_fd,
(struct sockaddr *) &clientaddr,
(socklen_t *) & addrlen)) == -1)
{
perror ("Server-accept() error lol!");
}
else
{
// lfs_printf("Server-accept() is OK...\n");
ev.events = EPOLLIN;
ev.data.fd = newfd;
if (epoll_ctl
(epfd, EPOLL_CTL_ADD, newfd, &ev) < 0)
{
perror ("epoll_ctl");
exit (1);
}
}
break;
}
else
{
if (events[index].events & EPOLLHUP)
{
// lfs_printf ("find event");
if (epoll_ctl
(epfd, EPOLL_CTL_DEL, client_fd, &ev) < 0)
{
perror ("epoll_ctl");
}
close (client_fd);
break;
}
if (events[index].events & EPOLLIN)
{
/* going to recv data
*/
if ((nbytes =
recv (client_fd, buf, 1024, 0)) <= 0)
{
if (nbytes == 0)
{
}
else
{
lfs_printf ("recv() error lol! %d",
client_fd);
perror ("");
}

if (epoll_ctl
(epfd, EPOLL_CTL_DEL, client_fd,
&ev) < 0)
{
perror ("epoll_ctl");
}
close (client_fd);
}
else
{

// lfs_printf ("nbytes=%d,recv %s,%c", nbytes,
// buf, buf[6]);
process_request (buf, client_fd);
memset (buf, 0, 4);

}
break;
}
}
}
}
return 0;
}

热心网友 时间:2023-10-21 00:09

我写的一个可运行的本地域socket的例子,监听端的服务地址为绝对路径。例如/tmp/ssss.socket
void *lfs_dispatcher_thread_fn (void *arg)
{
struct sockaddr_in clientaddr;
int fdmax;
int newfd;
char buf[1024];
int nbytes;
int addrlen;
int ret;
int epfd = -1;
int res = -1;
struct epoll_event ev;
int index = 0;
int listen_fd, client_fd = -1;
struct sockaddr_un srv_addr;

listen_fd = socket (AF_UNIX, SOCK_STREAM, 0);
if (listen_fd < 0)
{
perror ("cannot create listening socket");
}
else
{
srv_addr.sun_family = AF_UNIX;
strncpy (srv_addr.sun_path, UNIX_DOMAIN,
sizeof (srv_addr.sun_path) - 1);
unlink (UNIX_DOMAIN);
ret =
bind (listen_fd, (struct sockaddr *) &srv_addr,
sizeof (srv_addr));
if (ret == -1)
{
lfs_printf ("cannot bind server socket");
lfs_printf ("srv_addr:%p", &srv_addr);
close (listen_fd);
unlink (UNIX_DOMAIN);
exit (1);
}
}

ret = listen (listen_fd, 1);
if (ret == -1)
{
perror ("cannot listen the client connect request");
close (listen_fd);
unlink (UNIX_DOMAIN);
exit (1);
}
chmod (UNIX_DOMAIN, 00777);//设置通信文件权限

fdmax = listen_fd;/* so far, it's this one */

events = calloc (MAX_CON, sizeof (struct epoll_event));
if ((epfd = epoll_create (MAX_CON)) == -1)
{
perror ("epoll_create");
exit (1);
}
ev.events = EPOLLIN;
ev.data.fd = fdmax;
if (epoll_ctl (epfd, EPOLL_CTL_ADD, fdmax, &ev) < 0)
{
perror ("epoll_ctl");
exit (1);
}
//time(&start);
for (;;)
{
res = epoll_wait (epfd, events, MAX_CON, -1);
client_fd = events[index].data.fd;
for (index = 0; index < MAX_CON; index++)
{
if (client_fd == listen_fd)
{
addrlen = sizeof (clientaddr);
if ((newfd =
accept (listen_fd,
(struct sockaddr *) &clientaddr,
(socklen_t *) & addrlen)) == -1)
{
perror ("Server-accept() error lol!");
}
else
{
// lfs_printf("Server-accept() is OK...\n");
ev.events = EPOLLIN;
ev.data.fd = newfd;
if (epoll_ctl
(epfd, EPOLL_CTL_ADD, newfd, &ev) < 0)
{
perror ("epoll_ctl");
exit (1);
}
}
break;
}
else
{
if (events[index].events & EPOLLHUP)
{
// lfs_printf ("find event");
if (epoll_ctl
(epfd, EPOLL_CTL_DEL, client_fd, &ev) < 0)
{
perror ("epoll_ctl");
}
close (client_fd);
break;
}
if (events[index].events & EPOLLIN)
{
/* going to recv data
*/
if ((nbytes =
recv (client_fd, buf, 1024, 0)) <= 0)
{
if (nbytes == 0)
{
}
else
{
lfs_printf ("recv() error lol! %d",
client_fd);
perror ("");
}

if (epoll_ctl
(epfd, EPOLL_CTL_DEL, client_fd,
&ev) < 0)
{
perror ("epoll_ctl");
}
close (client_fd);
}
else
{

// lfs_printf ("nbytes=%d,recv %s,%c", nbytes,
// buf, buf[6]);
process_request (buf, client_fd);
memset (buf, 0, 4);

}
break;
}
}
}
}
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
考研可以查试卷的各题得分吗 如何看到自己的考研试卷 考研成绩可以查各题得分吗 原神机关棋谭双风双岩队伍怎么玩_机关棋谭双风双岩队伍推荐 原神双风阵容怎么搭配 原神魈双风阵容怎么搭配-魈双风阵容搭配推荐 Java有发展潜力还是C#有发展潜力 兴智联和电信什么关系 玫瑰花酱做法二 武汉兴智联科技服务有限公司怎么样 手机双卡双待怎么用? 红米k30至尊纪念版相机的闪光灯4种模式都是什么? 红米手机照相时闪光灯怎么不亮 linux中关于流式套接字编程代码的解释,求大神把每行代码加上注释,具体一点 为什么我我的红米手机照像拍照时不亮灯 公积金贷款后,如以后停止缴纳公积金。公积金公司和银行该怎样处理这种情况?利率改变吗? linux select检测为啥是监听套接字 公积金贷款之后,现在公积金断交了,有什么影响,该怎么办 为什么linux中监听套接字时最大能监听多少套接字 离职后公积金停交了,里面的钱还能还房贷吗 如果还着公积金贷款,突然公积金断了,怎么还贷款呢? Linux 使用 socket 函数建立套接字后,这个套接字文件会放在哪里 公积金贷款的还款过程中,公积金停交后,续交了没扣款怎么办理继续代扣? linux 下创建套接字函数SOCKET()头文件问题。 用住房公积金贷款买房后,住房公积金报停,贷款怎么还 linux中套接字文件丢失怎么办 公积金停了贷款怎么还 怎样用手机进入微信文件夹 如何进入手机微信文件夹? 肥东滑翔伞在哪 linux下如何用socket套接字来代替ping程序来检测终 linux原始套接字怎么从报文提取数据data 求教:怎么将红米手机里面的相机和手电筒同时打开使用 linux一个程序可以创建几个套接字?求大神指点迷津 linux soket编程 服务端 为什么要两个套接字呢 要上高速etc安装时间半年了卡拿下来了一直没用怎么用? 高速公路 ETC 使用疑问。我一周走一次高速,平时我是把卡拔下来,用的时候再插上。还是一直插上? ETC卡不用时拔下二三个月还能用吗? etc长时间没用,设备没移动过,卡一拔一插显示蓝牙已可以正常抬杆吗? 居家瘦的减肥方式如何? 居家一周减肥食谱 从木樨园到北京站怎么坐公交或者坐地铁? 从木樨园去北京站坐多少路公交车 从北京木樨园到北京火车站该怎么转车啊? 北京木胥圆到北京站坐车怎么走 从木樨园长途汽车站到北京西站 怎么走 木樨园到北京站坐哪路公交?或者打车多少钱?急急急。 从木樨园到北京站怎么走 北京木樨园到北站怎么走 木樨园到北京站得多长时间啊