当前位置: 技术问答>linux和unix
俺分多,散分啦!(linux socket网络编程高手请进,分不够再加)
来源: 互联网 发布时间:2015-02-11
本文导语: 小的正在写一个telnet server,有几个问题请教各位大侠: 1.当用户 telnet上远程服务器后,如何在服务器端编程实现: (1)取得当前连接到telnet server上的用户数目, (2)取得所有连接到telent server上的用户IP地址列表 (3)取得所...
小的正在写一个telnet server,有几个问题请教各位大侠:
1.当用户 telnet上远程服务器后,如何在服务器端编程实现:
(1)取得当前连接到telnet server上的用户数目,
(2)取得所有连接到telent server上的用户IP地址列表
(3)取得所有连接到telent server上的用户登录名
(4)断开用户连接
请用C语言实现.
1.当用户 telnet上远程服务器后,如何在服务器端编程实现:
(1)取得当前连接到telnet server上的用户数目,
(2)取得所有连接到telent server上的用户IP地址列表
(3)取得所有连接到telent server上的用户登录名
(4)断开用户连接
请用C语言实现.
|
小的正在写一个telnet server,有几个问题请教各位大侠:
1.当用户 telnet上远程服务器后,如何在服务器端编程实现:
(1)取得当前连接到telnet server上的用户数目,
(2)取得所有连接到telent server上的用户IP地址列表
(3)取得所有连接到telent server上的用户登录名
(4)断开用户连接
请用C语言实现.
==================================================================
首先你要确信,几十个用户的server端远比client端好写
我目前正在写一个管理系统,功控制台和telnet登陆管理使用。支持IPV6和ipv4两种协议,相关代码网上都有.
if( -1 == ( sockfd = socket( AF_INET6, SOCK_STREAM, 0 ) ) )
{
perror( "socket" );
return -1;
}
/* 服务器端填充 sockaddr结构 */
/*
* 创建监听套接字
*/
bzero( &serv_addr, sizeof( struct sockaddr_in6 ) );
serv_addr.sin6_family = AF_INET6;
serv_addr.sin6_addr = in6addr_any; /* 结构分配 */
serv_addr.sin6_port = htons( whichport );
/* 允许局部地址重用 */
sock_opt = 1;
if( -1 == setsockopt( sockfd,
SOL_SOCKET,
SO_REUSEADDR,
( void * )&sock_opt,
sizeof( sock_opt ) )
)
{
perror( "setsockopt( SO_REUSEADDR )" );
close( sockfd );
return -1;
}
/* 捆绑sockfd描述符 */
if( -1 == bind( sockfd,( struct sockaddr * )( &serv_addr ), sizeof( struct s
ockaddr_in6 ) ) )
{
perror( "bind" );
close( sockfd );
return -1;
}
/* 监听sockfd描述符 */
if( -1 == listen( sockfd, 1 ) )
{
perror( "listen" );
close( sockfd );
return -1;
}
pid = 0;
while( TRUE )
{
/* 服务器阻塞,直到客户程序建立连接 */
sin_size = sizeof( struct sockaddr_in6 );
if( -1 == ( new_fd = accept( sockfd, ( struct sockaddr * )( &cli_addr ),
&sin_size ) ) )
{
perror( "accept" );
return -1;
}
//IPV6应用层就这么简单,这里可以在accept之后判断连接数目,注意最好不要accept之前判断,因为accept已经被系统接受,accept后根据连接数目决定是否断开。
=============================================
已经知道了如何accept,当然就可以用inet_ntop来显示用户的ip地址了
+--------------------------------------------------+
| User connect from |
| 192.168.1.111 |
| 2700 |
IPV4连接
+--------------------------------------------------+
| User connect from |
| fe80::207:95ff:fec7:a769 |
| 1027 |
+--------------------------------------------------+
IPV6连接
用
if( IN6_IS_ADDR_V4MAPPED( &cli_addr.sin6_addr ) )// IPV4
判断哪种连接
用
if( start_type == 2 )
{
memcpy( &in6.sin6_addr, temp_ip, 16 );
sprintf( loginlogo, "%s", inet_ntop( AF_INET6,
(void *)&in6.sin6_addr,
addrbuf,
sizeof( addrbuf )
) );
}
else if( start_type == 1 )
{
memcpy( &in.s_addr, &temp_ip[ 12 ], 4 );
sprintf( loginlogo, "%s", inet_ntoa( in ) );
}
实现转化成ip地址字符串
1.当用户 telnet上远程服务器后,如何在服务器端编程实现:
(1)取得当前连接到telnet server上的用户数目,
(2)取得所有连接到telent server上的用户IP地址列表
(3)取得所有连接到telent server上的用户登录名
(4)断开用户连接
请用C语言实现.
==================================================================
首先你要确信,几十个用户的server端远比client端好写
我目前正在写一个管理系统,功控制台和telnet登陆管理使用。支持IPV6和ipv4两种协议,相关代码网上都有.
if( -1 == ( sockfd = socket( AF_INET6, SOCK_STREAM, 0 ) ) )
{
perror( "socket" );
return -1;
}
/* 服务器端填充 sockaddr结构 */
/*
* 创建监听套接字
*/
bzero( &serv_addr, sizeof( struct sockaddr_in6 ) );
serv_addr.sin6_family = AF_INET6;
serv_addr.sin6_addr = in6addr_any; /* 结构分配 */
serv_addr.sin6_port = htons( whichport );
/* 允许局部地址重用 */
sock_opt = 1;
if( -1 == setsockopt( sockfd,
SOL_SOCKET,
SO_REUSEADDR,
( void * )&sock_opt,
sizeof( sock_opt ) )
)
{
perror( "setsockopt( SO_REUSEADDR )" );
close( sockfd );
return -1;
}
/* 捆绑sockfd描述符 */
if( -1 == bind( sockfd,( struct sockaddr * )( &serv_addr ), sizeof( struct s
ockaddr_in6 ) ) )
{
perror( "bind" );
close( sockfd );
return -1;
}
/* 监听sockfd描述符 */
if( -1 == listen( sockfd, 1 ) )
{
perror( "listen" );
close( sockfd );
return -1;
}
pid = 0;
while( TRUE )
{
/* 服务器阻塞,直到客户程序建立连接 */
sin_size = sizeof( struct sockaddr_in6 );
if( -1 == ( new_fd = accept( sockfd, ( struct sockaddr * )( &cli_addr ),
&sin_size ) ) )
{
perror( "accept" );
return -1;
}
//IPV6应用层就这么简单,这里可以在accept之后判断连接数目,注意最好不要accept之前判断,因为accept已经被系统接受,accept后根据连接数目决定是否断开。
=============================================
已经知道了如何accept,当然就可以用inet_ntop来显示用户的ip地址了
+--------------------------------------------------+
| User connect from |
| 192.168.1.111 |
| 2700 |
IPV4连接
+--------------------------------------------------+
| User connect from |
| fe80::207:95ff:fec7:a769 |
| 1027 |
+--------------------------------------------------+
IPV6连接
用
if( IN6_IS_ADDR_V4MAPPED( &cli_addr.sin6_addr ) )// IPV4
判断哪种连接
用
if( start_type == 2 )
{
memcpy( &in6.sin6_addr, temp_ip, 16 );
sprintf( loginlogo, "%s", inet_ntop( AF_INET6,
(void *)&in6.sin6_addr,
addrbuf,
sizeof( addrbuf )
) );
}
else if( start_type == 1 )
{
memcpy( &in.s_addr, &temp_ip[ 12 ], 4 );
sprintf( loginlogo, "%s", inet_ntoa( in ) );
}
实现转化成ip地址字符串
|
1.accpet调用可以知道客户端的ip地址
2。使用一个全局计数器,你没调用一次accept,计数器加一,当连接断开,计数器接一
3。那是你如何实现telnet协议的问题了,你需要记录每个用户的名字
4。/????
看看linux的telnet服务器源代码把
2。使用一个全局计数器,你没调用一次accept,计数器加一,当连接断开,计数器接一
3。那是你如何实现telnet协议的问题了,你需要记录每个用户的名字
4。/????
看看linux的telnet服务器源代码把
|
老猫不是已经回答了么?
我倒是觉得telnet服务器编程重点不在这里。而在于如何实现telnet的规范。
如果你连这些都写不出来,我建议你先找本[unix网络编程]看看。
我倒是觉得telnet服务器编程重点不在这里。而在于如何实现telnet的规范。
如果你连这些都写不出来,我建议你先找本[unix网络编程]看看。
|
用
The domain name queries carried out by gethostbyname() and
gethostbyaddr() use a combination of any or all of the
name server named(8), a broken out line from /etc/hosts,
and the Network Information Service (NIS or YP), depending
upon the contents of the order line in /etc/host.conf.
(See resolv+(8)). The default action is to query
named(8), followed by /etc/hosts.
得到对方的用户名称
用
close关闭连接描述符
The domain name queries carried out by gethostbyname() and
gethostbyaddr() use a combination of any or all of the
name server named(8), a broken out line from /etc/hosts,
and the Network Information Service (NIS or YP), depending
upon the contents of the order line in /etc/host.conf.
(See resolv+(8)). The default action is to query
named(8), followed by /etc/hosts.
得到对方的用户名称
用
close关闭连接描述符