/***************************************************
版权说明:该程序为Shaw Song所有
版本号: 2.0
生成日期:2016.8.2
作者: Shaw Song
内容: 服务端源程序
功能: 运行于linux服务器端,接收并完成以下三种服务
1.客户端登录服务
2.客户端注册服务
3.客户端交流服务
函数列表:1.main
修改日志:2016.08.02 Shaw Song 修改程序使之符合C语言编码规范
****************************************************/
#include"server.h"
int main()
{
/* 初始化变量 */
int ListenFd, ClientFd;//ListenFd为监听套接字,ClientFd为服务套接字
struct sockaddr_in ServerAddr;
struct sockaddr_in ClientAddr;
pid_t ServerProcess;//服务器进程
int AddrLen = sizeof(struct sockaddr_in); //AddrLen为socket大小
/* 建立socket */
ListenFd = socket(PF_INET, SOCK_STREAM, 0);
if (ListenFd < 0)
{
perror("socket fail");
return 0;
}
/* 配置socket */
ServerAddr.sin_family = AF_INET;//表示tcp/ip协议
ServerAddr.sin_port = htons(Port);//主机序转成网络序
ServerAddr.sin_addr.s_addr = INADDR_ANY;
memset(ServerAddr.sin_zero, 0, 8);
/* Bind */
if (bind(ListenFd, (struct sockaddr*)&ServerAddr, AddrLen) < 0)
{
perror("Bind error");
return 0;
}
/* Listen */
if (listen(ListenFd, 20))
{
perror("Listen error");
return 0;
}
/*建立一个用于存放登录信息的信息区*/
struct Message msg;
char buffer[BUFFERSIZE];
memset(&msg, '\0', sizeof(&msg));
memset(buffer, '\0', BUFFERSIZE);
/* 连接客户端 */
while (1)
{
ClientFd = accept(ListenFd, (struct sockaddr*)&ClientAddr, &AddrLen);
ServerProcess = fork();
if (ServerProcess < 0)
{
perror("fork error");
return 0;
}
else if (ServerProcess > 0)
{
close(ClientFd);
continue;
}
else
{
/* 子进程完成登录服务 */
while (1)
{
memset(&msg, 0, sizeof(&msg));
recv(ClientFd, buffer, BUFFERSIZE, 0);
printf("%s\n", buffer);
msg = *(struct Message*)buffer;
//验证是何种服务
if (memcmp(msg.head, "LOGI", 4) == 0)
{
printf("%s\n",msg.content);
Server_Login(ClientFd,buffer);
continue;
}
else if (memcmp(msg.head, "TALK", 4) == 0)
{
printf("Let's start talking\n");
Server_Talk(ClientFd);
}
else if (memcmp(msg.head, "SIGN", 4) == 0)
{
printf("Sign serve\n");
Server_Sign(ClientFd);
}
else if (memcmp(msg.head, "QUIT", 4) == 0)
{
printf("Client Quit!\n");
exit(0);
}
else
printf("Wrong serve Request!");//end of if
}/* end of while(1),子进程服务 */
}
close(ClientFd);//监听进程关闭客户Socket,继续进行监听;服务进程服务结束后关闭客户Socket
}//end of while (1)
close(ListenFd);
return 0;
}
tcp/ip 程序 (改进版) server.c
最新推荐文章于 2022-02-09 18:01:09 发布