精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● PHP>>功能代码>>聊天室>>与大家讨论不刷新聊天室的问题,请感兴趣(2)

主题:与大家讨论不刷新聊天室的问题,请感兴趣(2)
发信人: jackyz()
整理人: (2000-08-10 13:58:29), 站内信件
[转]CGI版中的C的chat server源程序
----------------------------------------------------------------------

发信人: leex (leex), 信区: CGI 
标  题: chat server源程序 
发信站: 网易虚拟社区 (Mon Dec  6 12:54:09 1999), 站内信件 

应各位网友要求,我把chat server的源程序贴出来。 

下面就是我一夜未眠的一点所得,为了赶时间,偷了 
很多的懒(:^),比如少了很多出错判断,连文件锁都 
没加,也可用共享内存来代替文件spool,用线程库来写, 
可能效率会高一些。这只是一个技术演示程序,希望起 
到一个抛砖引玉的作用。待我把它完善了,再给大家, 
一起探讨。 

/* 
Chat Server Test 

program by leex(1999/12/6 4:51) 
compile under redhat linux 6.0 

[email protected] 
*/ 
#include <stdio.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <signal.h> 
#include <sys/wait.h> 

#define SERV_PORT 6666 
#define INTERVAL 3 
#define SPOOLFILE "spool.dat" 

#define MAXLINE 4096 
#define TALKERNAMELEN 20 
#define MSGLEN 80 

typedef struct{ 
int magic; 
int msgcount; 
}SPOOLFILEHEADER; 

typedef struct{ 
char talkername[TALKERNAMELEN]; 
char msg[MSGLEN]; 
}MSGBODY; 

void str_serv(int connfd,struct sockaddr_in *cliaddr); 
void createspool(); 
void addtospool(char *talkername,char *chatmsg); 

int main() 

int listenfd,connfd; 
struct sockaddr_in servaddr,cliaddr; 
int clilen; 
int childpid; 

void sig_child(); 

createspool(); 

listenfd = socket(AF_INET,SOCK_STREAM,0); 

bzero(&servaddr,sizeof(servaddr)); 
servaddr.sin_family = AF_INET; 
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
servaddr.sin_port = htons(SERV_PORT); 
bind(listenfd,&servaddr,sizeof(servaddr)); 

listen(listenfd,5); 

signal(SIGCLD,sig_child); 

for(;;){ 
clilen = sizeof(cliaddr); 
connfd = accept(listenfd,&cliaddr,&clilen); 

if((childpid = fork()) == 0){ 
close(listenfd); 
str_serv(connfd,&cliaddr); 
exit(0); 


close(connfd); 

}  

void str_serv(int connfd,struct sockaddr_in *cliaddr) 

char *r200 = "HTTP/1.1 200\n"; 
char *header = "Content-type:text/html\n"; 
char *end = "\n"; 
char *autoscroll = "<SCRIPT LANGUAGE=\"JavaScript1.1\"> 
<!--
var autoScrollOn = 1;var scrollOnFunction;var scrollOffFunction;
function scrollit(){if(!parent.d.document.inputform.as.checked){autoSc



rollOn=0;return true;}else {autoScrollOn=1;StartUp();return true;}}
function scrollWindow( ){if ( autoScrollOn == 1 ){this.scroll(0, 65000



);setTimeout('scrollWindow()',200);}}
function scrollOn( ){autoScrollOn = 1;scrollWindow( );}
function scrollOff( ){autoScrollOn = 0;}
function StartUp( ){this.onblur = scrollOnFunction;this.onfocus = scr



ollOffFunction;scrollWindow( );}
scrollOnFunction = new Function('scrollOn( )')
scrollOffFunction = new Function('scrollOff( )')
StartUp();
//--></script>"; 

char *info = " 说:这是一条测试信息!<br> 



"; 

int curpos; 
FILE *file; 
SPOOLFILEHEADER fheader; 
MSGBODY msg; 
char chatmsg[MAXLINE]; 
int i; 

curpos = 0; 

addtospool((char *)inet_ntoa(cliaddr->sin_addr)," 



各位朋友,大家好
"); 

write(connfd,r200,strlen(r200)); 
write(connfd,header,strlen(header)); 
write(connfd,end,strlen(end)); 
write(connfd,"<HTML>",6); 
write(connfd,autoscroll,strlen(autoscroll)); 
while(1){ 
file = fopen(SPOOLFILE,"r"); 
fread(&fheader,sizeof(SPOOLFILEHEADER),1,file); 
fseek(file, sizeof(SPOOLFILEHEADER)+curpos*sizeof(MSGBODY), SEEK_SET 



); 
for(i=0;i<fheader.msgcount-curpos;i++){
fread(&msg,sizeof(MSGBODY),1,file);
snprintf(chatmsg,MAXLINE,"%s 说:%s<br>", 

msg.talkername,msg.msg); 
write(connfd,chatmsg,strlen(chatmsg)); 

fclose(file); 
curpos = fheader.msgcount; 


write(connfd,info,strlen(info)); 
sleep(INTERVAL); 

write(connfd,"</HTML>",6); 


void sig_child() 

int pid,stat; 

while((pid = waitpid(-1,&stat,WNOHANG))>0) 
addtospool("SYSOP","哈哈,某人掉线了!^_^ 



"); 


void createspool() 

FILE *file; 
SPOOLFILEHEADER fheader; 

fheader.magic = 8888; 
fheader.msgcount = 0; 

file = fopen(SPOOLFILE,"w+"); 
fwrite(&fheader,sizeof(SPOOLFILEHEADER),1,file); 
fclose(file); 


void addtospool(char *talkername,char *chatmsg) 

FILE *file; 
SPOOLFILEHEADER fheader; 
MSGBODY msg; 

snprintf(msg.talkername,TALKERNAMELEN,"%s",talkername); 
snprintf(msg.msg,MSGLEN,"%s",chatmsg); 
file = fopen(SPOOLFILE,"a"); 
fwrite(&msg,sizeof(MSGBODY),1,file); 
fclose(file); 

file = fopen(SPOOLFILE,"r+"); 
fread(&fheader,sizeof(SPOOLFILEHEADER),1,file); 
fheader.msgcount += 1; 
fseek(file, 0L, SEEK_SET); 
fwrite(&fheader,sizeof(SPOOLFILEHEADER),1,file); 
fclose(file); 


-- 
http://node.126.com 
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.98.35.146] 

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.191.80]

[关闭][返回]