QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 965|回复: 10

写一个xinetd服务时的错误

[复制链接]
发表于 2004-10-28 00:59:25 | 显示全部楼层 |阅读模式
我想写一个像telnetd一样的服务程序,加到xinetd中运行,
首先写了一个脚本如下:
===============================================service appdsvr
{
disable = no
flags = REUSE
socket_type = stream
protocol = tcp
user = root
wait = no
port = 1011
server = /home/workroom/appdsvr/debug/src/appdsvr
}
===============================================同时也把端口加到/etc/service中

然后写了server代码,如下:
===============================================struct sockaddr_in sin;
int sock_descriptor;
int temp_sock_descriptor;
int address_size;
int on = 1;
string strrecv;
struct servent *sp;

bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);

sp = getservbyname("appdsvr", "tcp");
sin.sin_port = sp->s_port;

sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);
if(sock_descriptor < 0)
{
msgout(3,"Create socket failed.");
exit(1);
}
(void) setsockopt(sock_descriptor, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
if(bind(sock_descriptor, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
msgout(3,"Bind failed. %s", strerror(errno));
close(sock_descriptor);
exit(1);
}
if(listen(sock_descriptor, 1) < 0)
{
msgout(3,"Listen failed.");
close(sock_descriptor);
exit(1);
}

if(-1 == (temp_sock_descriptor = accept(sock_descriptor, (struct sockaddr *)&pin, (socklen_t *)&address_size)))
{
msgout(3,"Accept failed.");
close(sock_descriptor);
exit(1);
}

......
===============================================

根据调试,发现当程序作为daemon运行后,在bind的时候会发生“Address already in use”的错误。
但是如果不运行为daemon,而将dsvr单独运行没有问题。
不知道哪位有这方面的经验,解我疑惑,不胜感激。
发表于 2004-10-28 04:17:39 | 显示全部楼层
看看setsockopt对不对,有没有成功
回复

使用道具 举报

 楼主| 发表于 2004-10-28 09:02:08 | 显示全部楼层
我去试试,
但是就算我不调用setsockopt, bind也会报这个错
回复

使用道具 举报

发表于 2004-10-28 10:13:30 | 显示全部楼层
回复

使用道具 举报

发表于 2004-10-28 10:21:50 | 显示全部楼层
我记得你一定要设reuse,不然xinetd占用了这个端口,你怎么能binding?
回复

使用道具 举报

 楼主| 发表于 2004-10-28 11:00:28 | 显示全部楼层
是呀,我也这么想,我测了一下setsockopt的返回值,没有问题呀。
是不是我忘了什么!
谁有xinetd程序编写这方面的资料?
我查过telnetd的源码,也没什么特殊之处。
回复

使用道具 举报

发表于 2004-10-28 15:37:38 | 显示全部楼层
你的程序不能在使用socket这样的调用。

因为xinetd替你封装了网络部分,对你的程序来说,只要处理基本输入输出就行,xinetd自动会把你程序中的基本输入输出重定向到网络上去。
回复

使用道具 举报

 楼主| 发表于 2004-10-28 19:53:35 | 显示全部楼层
To kakuyou:

     哦``,我正考虑这种可能,但一直未能找到相关资料。kakuyou兄能具体说明一下吗?既然xinetd封装了网络部分,应该有相应的接口吧?否则我如何接收,发送数据。
盼望回复中!
回复

使用道具 举报

发表于 2004-10-28 20:35:36 | 显示全部楼层
告诉你了,用文件的标准输入输出就行了。

写成普通的程序,然后
read (0 ... /*读标准输入*/
write(1 .... /* 写标准输出 */

xinetd把网络来的数据放到你程序的标准输入里,把你程序的标准输出里的数据发到网络的另一端。
回复

使用道具 举报

发表于 2004-10-29 11:46:21 | 显示全部楼层
受教,很久没玩inetd了,居然把这给忘了。。。
回复

使用道具 举报

 楼主| 发表于 2004-10-29 13:52:22 | 显示全部楼层
谢谢,已经搞定了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 05:31 , Processed in 0.050312 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表