一个局域网的聊天后台代码,请高手指点,(未完全完成)想知道是否可编译通过执行

check_up 2009-02-25 12:09:31
/*--------侦听套接字创建---------*/
CreateSock(int* pSock,int nPort, int nMax)
{
struct sockaddr_in addrin;
struct sockaddr* paddr=(struct sockaddr*)&addrin;
ASSERT(pSock!=NULL && nPort > 0 && nMax > 0);
memset(&addrin,0,sizeof(addin));
/*协议地址组包*/
addrin.sin_family=AF_INET; /*协议名*/
addrin.sin_addr.s_addr=htonl(INADDR_ANY);/*自动地址分配*/
addrin.sin_port=htons(nPort); /*端口号*/
/*创建TCP套接字描述符*/
ASSERT((*pSock = socket(AF_INET,SOCK_STREAM,0))>0);
/*命名套接字*/
if(VERIFY(bind(*pSock,paddr,sizeof(addin))>0 &&
VERIFY(listen(*pSock,nMax)>=0))) /*套接字进入侦听*/
return 0; /*准备成功,正确返回*/
VERFIY(close(*pSock)==0); /*准备失败,关闭套接字描述符*/
return 1;
}
/*接受连接请求函数*/
int AcceptSock(int* pSock,int nSock)
{
struct sockaddr_in addrin;
int lSize;
ASSERT(pSock!=NULL && nSock > 0);
while(1)
{
lSize=sizeof(addin);
memset(&addrin,0,sizeof(addrin));
/*阻塞接受客户端连接请求,并创建新的套接字描述符*/
if((&pSock = accept(nSock,(struct sockaddr*)&addrin,&lSize))>0)
return 0;
/*调用ACCEPT过程中接受到的信号,调用中断*/
else if(errno==EINTR) continue;
else ASSERT(0);
}
}
/*守护进程生成器*/
void clearChild(int nSignal)
{
pid_t _pid_t;
int nState;
while((_pid_t=waitpid(-1,&nState,WNOHANG))>0);
signal(SIGCLD,ClearChild);
}
int InitServer()
{
pid_t pid1;
ASSERT((pid1 = fork()) >= 0);/*创建子进程*/
if(pid1 != 0) /*父进程失败退出,子进程托管*/
{
sleep(1);
exit(0);
}
ASSERT(setsid() >= 0); /*子进程脱离终端*/
umask(0); /*清除文件创建掩码*/
signal(SIGINT,SIG_IGN); /*忽略SIGINT信号*/
signal(SIGCLD,ClearChild); /*处理SIGCLD信号,预防僵死进程*/
return 0;
}
int ChkLogonmsg(struct Logonmsg* buf)
{
struct user_info *p;
memset(p,sizeof(struct user_info),0);
p=head;/*head表示用户信息链表头指针*/
while(1)
{
if(strcmp(buf->usernam,p->uname))
{
if(strcmp(buf->passwd,p->passwd))
return 0;
}
else
{
p=p->next;
if(p==NULL) send(nSock,"-1",sizeof("-1"))/*用-1通知客户端密码或是用户名错*/
}
}
}


#define VERIFY(a) if(a) exit(0);

struct MSG
{
struct sockaddr Des;
char text[1024];
};
struct Logonmsg
{
char usernam[20];
char passwd[20];
};
struct user_info
{
char uname[20];
char passwd[20];
struct user_info* next;
};

#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>

main()
{
int nLisSock,nSock;/*监听和连接套接字*/
pid_t nChild;/*子进程ID*/
CreatSock(&nLisSock,PORT,MAX);/*创建侦听套接字*/
Initserver();/*后台执行*/
while(1)/*侦听并连接*/
{
ASSERT(AcceptSock(&nSock,nLisSock)==0);
VERIFY((nChild=fork())>=0);
if(nChild==0) break;/*子进程跳转到其代码*/
close(nSock);/*父进程关闭连接套接字*/
}
close(nLisSock);/*子进程关闭侦听套接字*/
while(1)/*用户验证*/
{
struct Logonmsg *buf;
memset(buf,0,sizeof(buf));
VERIFY(recv(nSock,buf,sizeof(struct Logonmsg),MSG_WAITALL)>0);
if(ChkLogonInfo(buf)) continue;/*若验证信息不正确,重新登录*/
}
struct MSG* buf1;/*通信数据结构*/
memset(buf1,0,sizeof(buf1));
int pSock;/*定义目的套接字*/
CreateSock(&pSock,PORT,1);/*创建*/
while(1)/**/
{
while(recv(nsock,(struct MSG*)buf1,sizeof(buf1),0)<=0);
if(strcmp(buf1->text,"exit")
{
close(pSock);
close(nSock);
exit(0);
}
if(Connect(&pSock,buf->Des,sizeof(sockaddr_in)))
{
send(nSock,"can't connect.\n",sizeof("can't connect.\n"),MSG_DONTROUTE);
close(pSock);
close(nSock);
exit(0);
}
send(pSock,buf1->text,sizeof(buf1->text),MSG_DONTROUTE);
}
}
...全文
114 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
waizqfor 2009-02-25
  • 打赏
  • 举报
回复
不错 先学习一下
check_up 2009-02-25
  • 打赏
  • 举报
回复
补充:
是基于UNIX的

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧