文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>基于Socket通讯技术的chatserver

基于Socket通讯技术的chatserver

时间:2007-02-17  来源:PHP爱好者

作者/来源:leex
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
基于Socket通讯技术的chat server(c程序)
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
/*
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
Chat Server Test
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
*/
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
#include
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
#include
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
#include
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
#include
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
#include
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
#include
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
#define MAXLINE 4096
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
#define TALKERNAMELEN 20
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
#define MSGLEN 80
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
typedef struct{
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
int magic;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
int msgcount;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
}SPOOLFILEHEADER;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
int main()
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
{
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
int listenfd,connfd;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
struct sockaddr_in servaddr,cliaddr;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
int clilen;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
int childpid;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
void sig_child();
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
createspool();
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
listenfd = socket(AF_INET,SOCK_STREAM,0);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
listen(listenfd,5);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
signal(SIGCLD,sig_child);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
close(connfd);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
}
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
}
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
void str_serv(int connfd,struct sockaddr_in *cliaddr)
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
{
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
char *r200 = "HTTP/1.1 200n";
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
char *header = "Content-type:text/htmln";
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
char *end = "n";
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
char *autoscroll = "";
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
char *info = "你 说:这是一条测试信息!
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
";
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
curpos = 0;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
各位朋友,大家好");
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
for(i=0;i fread(&msg,sizeof(MSGBODY),1,file);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
snprintf(chatmsg,MAXLINE,"%s 说:%s
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
",
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
msg.talkername,msg.msg);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
write(connfd,chatmsg,strlen(chatmsg));
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
}
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
fclose(file);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
curpos = fheader.msgcount;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
write(connfd,info,strlen(info));
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
sleep(INTERVAL);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
}
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
write(connfd,"",6);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
}
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
void sig_child()
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
{
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
int pid,stat;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
");
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
}
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
void createspool()
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
{
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
FILE *file;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
SPOOLFILEHEADER fheader;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
void addtospool(char *talkername,char *chatmsg)
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
{
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
FILE *file;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
SPOOLFILEHEADER fheader;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
MSGBODY msg;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ

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

chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
file = fopen(SPOOLFILE,"r+");
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
fread(&fheader,sizeof(SPOOLFILEHEADER),1,file);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
fheader.msgcount += 1;
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
fseek(file, 0L, SEEK_SET);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
fwrite(&fheader,sizeof(SPOOLFILEHEADER),1,file);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
fclose(file);
chinaitpower.com55E2xSiINkK9mrHj7wwMcQiQZ
}
php爱好者站 http://www.phpfans.net dreamweaver|flash|fireworks|photoshop.
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载