基于Socket通讯技术的chat server(c程序)
/* Chat Server Test
program by leex(1999/12/6 4:51) compile under redhat linux 6.0
*/ #include #include #include #include #include #include
#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 = " ";
char *info = "你 说:这是一条测试信息!
";
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,"",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%s 说:%s ",
msg.talkername,msg.msg); write(connfd,chatmsg,strlen(chatmsg)); } fclose(file); curpos = fheader.msgcount;
write(connfd,info,strlen(info)); sleep(INTERVAL); } write(connfd,"",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); }
基于Socket通讯技术的chat server |