问答文章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
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 手机双卡双待怎么用? 红米k30至尊纪念版相机的闪光灯4种模式都是什么? 红米手机照相时闪光灯怎么不亮 linux中关于流式套接字编程代码的解释,求大神把每行代码加上注释,具体一点 为什么我我的红米手机照像拍照时不亮灯 公积金贷款后,如以后停止缴纳公积金。公积金公司和银行该怎样处理这种情况?利率改变吗? linux select检测为啥是监听套接字 公积金贷款之后,现在公积金断交了,有什么影响,该怎么办 为什么linux中监听套接字时最大能监听多少套接字 离职后公积金停交了,里面的钱还能还房贷吗 如果还着公积金贷款,突然公积金断了,怎么还贷款呢? Linux 使用 socket 函数建立套接字后,这个套接字文件会放在哪里 公积金贷款的还款过程中,公积金停交后,续交了没扣款怎么办理继续代扣? linux 下创建套接字函数SOCKET()头文件问题。 用住房公积金贷款买房后,住房公积金报停,贷款怎么还 linux中套接字文件丢失怎么办 公积金停了贷款怎么还 怎样用手机进入微信文件夹 如何进入手机微信文件夹? 肥东滑翔伞在哪 linux下如何用socket套接字来代替ping程序来检测终 linux原始套接字怎么从报文提取数据data 求教:怎么将红米手机里面的相机和手电筒同时打开使用 linux一个程序可以创建几个套接字?求大神指点迷津 linux soket编程 服务端 为什么要两个套接字呢 要上高速etc安装时间半年了卡拿下来了一直没用怎么用? 高速公路 ETC 使用疑问。我一周走一次高速,平时我是把卡拔下来,用的时候再插上。还是一直插上? ETC卡不用时拔下二三个月还能用吗? etc长时间没用,设备没移动过,卡一拔一插显示蓝牙已可以正常抬杆吗? 居家瘦的减肥方式如何? 居家一周减肥食谱 从木樨园到北京站怎么坐公交或者坐地铁? 从木樨园去北京站坐多少路公交车 从北京木樨园到北京火车站该怎么转车啊? 北京木胥圆到北京站坐车怎么走 从木樨园长途汽车站到北京西站 怎么走 木樨园到北京站坐哪路公交?或者打车多少钱?急急急。 从木樨园到北京站怎么走 北京木樨园到北站怎么走 木樨园到北京站得多长时间啊