#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 5555
#define BACKLOG 10
#define MAX(a,b) ((a)>(b)?(a):(b))
void str_echo(int)
void server()
{
int sockfd,client_fd
struct sockaddr_in my_addr
struct sockaddr_in remote_addr
socklen_t sin_size
if((sockfd=socket(AF_INET,SOCK_STREAM,0))== -1)
{
perror("socket create error!")
exit(1)
}
my_addr.sin_family=AF_INET
my_addr.sin_port=htons(SERVPORT)
my_addr.sin_addr.s_addr=INADDR_ANY
bzero(&(my_addr.sin_zero),8)
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind error!")
exit(1)
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen error!")
exit(1)
}
while(1)
{
sin_size=sizeof(struct sockaddr_in)
if((client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size))==-1)
{
perror("accept error!")
continue
}
printf("received a connection from %s\n",inet_ntoa(remote_addr.sin_addr))
if(!fork())
{
close(sockfd)
str_echo(client_fd)
exit(0)
}
close(client_fd)
}
}
void str_echo(int sockfd)
{
int maxfd
char sendbuf[1024]={0}
char recvbuf[1024]={0}
fd_set rfds
while(1)
{
FD_SET(0,&rfds)
FD_SET(sockfd,&rfds)
maxfd=MAX(0,sockfd)+1
select(maxfd,&rfds,NULL,NULL,NULL)
if(FD_ISSET(sockfd,&rfds))
{
bzero(recvbuf,1024)
recv(sockfd,recvbuf,1024,0)
printf("C:%s\n",recvbuf)
}
if(FD_ISSET(0,&rfds))
{
read(0,sendbuf,1024)
send(sockfd,sendbuf,strlen(sendbuf),0)
bzero(sendbuf,1024)
}
}
}
int main()
{
server()
return 0
}
/*客户端*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 5555
#define MAXSIZE 1024
#define MAX(a,b) ((a)>(b)?(a):(b))
void client(int argc,char **argv)
{
int sockfd,maxfd
char sendbuf[MAXSIZE]={0}
char recvbuf[MAXSIZE]={0}
// struct hostent *host
struct sockaddr_in serv_addr
fd_set rfds
/* if(argc<2)
{
fprintf(stderr,"Please enter the sserver's name!\n")
exit(1)
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("get host by name error!\n")
exit(1)
}
*/
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket creat error!\n")
exit(1)
}
serv_addr.sin_family=AF_INET
serv_addr.sin_port=htons(SERVPORT)
// serv_addr.sin_addr=*((struct in_addr *)host->h_addr)
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1")
bzero(&(serv_addr.sin_zero),8)
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
perror("connection error!\n")
exit(1)
}
FD_ZERO(&rfds)
while(1)
{
FD_SET(0,&rfds)
FD_SET(sockfd,&rfds)
maxfd=MAX(0,sockfd)+1
select(maxfd,&rfds,NULL,NULL,NULL)
if(FD_ISSET(sockfd,&rfds))
{
bzero(recvbuf,MAXSIZE)
recv(sockfd,recvbuf,MAXSIZE,0)
printf("S:%s\n",recvbuf)
}
if(FD_ISSET(0,&rfds))
{
fgets(sendbuf,MAXSIZE,stdin)
send(sockfd,sendbuf,strlen(sendbuf),0)
bzero(sendbuf,MAXSIZE)
}
}
// close(sockfd)
}
int main(int argc,char **argv)
{
client(argc,argv)
return 0
}
这个估计不是即时的,,用框架就是为了刷新一次SHOW.ASP,,, 建议你另外换一个吧,,,有很多是即时的, 以前在用艾恩上传组件时候,看到他有出过聊天室,,你搜索一下:艾恩在线聊天室实现Linux下的局域网远程接入,利用Linux服务器的两个串口构建拨号服务器的方法,远程用户可以通过拨号连接到局域网,方便地进行信息传递和资源共享。
实现步骤如下:
初始化串口设备
在/etc/inittab文件中加入如下两行,用来初始化ttyS0和ttyS1两个串口设备:
S0:345:respawn:/sbin/mgetty -D -X 3 ttyS0
S1:345:respawn:/sbin/mgetty -D -X 3 ttyS1
然后,运行“/sbin/init q”命令使改动生效。
指定认证方式
在/etc/PPP目录下创建文件ppplogin,内容如下:
#!/bin/sh
/usr/sbin/pppd auth -chap +pap login
该文件指定用户登录时采用PAP认证。PAP和CHAP是PPP服务的两种身份验证协议。
保存文件后,给文件设置执行的权限:
#chmod a+x /etc/ppp/ppplogin
然后,更改/etc/mgetty+sendfax/login.config文件,去掉“/AutoPPP/”一行前面的注释,并改为如下内容:
/AutoPPP/ - - /etc/PPP/ppplogin
修改options文件
修改/etc/PPP/Options文件为如下内容;
detach
Modem
Lock
crtscts
asyncmap 0
netmask 255.255.255.0
proxyarp
ms-dns 192.168.11.1
“detach”选项非常重要。如果不指定这个选项,拨号程序就会进入后台,使得Shell脚本退出,随之而来的是串行线路被挂断,导致连接中止。“detach”防止了tty设备脱离PPPD的控制。
“Modem”选项使得PPPD监视DTR引线,可以观察到对等点是否已掉线。
“Lock”选项指定在串行设备上使用UUCP风格的锁定。
“crtscts”选项用以打开硬件握手信号。
“asyncmap 0”设置了异步字符映射,这个映射指定控制字符不能直接通过连接发送,需要先进行转义。
“netmask 255.255.255.0”设定PPP网络接口的网络掩码。
“proxyarp”选项打开了ARP代理功能。
“ms-dns”2.168.11.1”指定了局域网内的DNS服务器地址,如没有可以不设。
给拨入用户分配IP
创建/etc/ppp/Options.ttyS0和/etc/ppp/
options.ttyS1两个文件,内容如下:
# Vi options.ttyS0
192.168.11.3:192.168.11.242
# Vi options.ttys1
192.168.11.3:192.168.11.243
其中,“192.168.11.3”是用作拨号服务器的那台Linux机器的IP地址,“192.168.
11.242”和“192.168.11.243”是分别指定给COM1口和COM2口拨入用户的IP地址。
口令验证
编辑文件/etc/PPP/pap-secrets,内容如下:
* * "secret" 192.168.11.242
* * "password" 192.168.11.243
如上所示,每行代码包含四列,分别代表用户名、服务器地址、口令值和IP地址列表。“*”表示可以与任何内容进行匹配。
用户拨入后,如果需要访问局域网内的其它服务器,就必须打开IP转发功能:
echo 1>/proc/sys/net/ipv4/ip_forward
要想在空闲一段时间后自动解除连接,需要在/etc/ppp/options中加入如下一行:
idle 600
上述代码中,“600”表示600秒,即10分钟。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)