#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#define SERVER_PORT 8888
#define BACKLOG 10
//struct sockaddr_in{
// unsigned short sin_family;
// unsigned short int sin_port;
// struct in_addr sin_addr;
// unsigned char sin_zero[8];
//};
int main(int argc, char **argv)
{
int iSocketServerFd;
int iSocketClientFd;
struct sockaddr_in tSocketServerAddr;
struct sockaddr_in tSocketClientAddr;
int iAddrLen;
int iClientNum = -1;
unsigned char ucRecvBuf[1000];
int iRecvLen;
tSocketServerAddr.sin_family=AF_INET;
tSocketServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);
tSocketServerAddr.sin_port=htons(SERVER_PORT);
memset(tSocketServerAddr.sin_zero, 0, 8); //bzero(&tSocketServerAddr,sizeof(struct sockaddr_in));放前面时全部清零
signal(SIGCHLD,SIG_IGN); //防止壃死进程
if ((iSocketServerFd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("get socket failed \n");
return -1;
}
if (bind(iSocketServerFd,(const struct sockaddr *)(&tSocketServerAddr),sizeof(struct sockaddr))==-1)
{
printf("bind error!\n");
return -1;
}
if (listen(iSocketServerFd, BACKLOG)==-1)
{
printf("listen error!\n");
return -1;
}
while (1)
{
iAddrLen = sizeof(struct sockaddr);
if ((iSocketClientFd = accept(iSocketServerFd, (struct sockaddr *)(&tSocketClientAddr), &iAddrLen)) == -1)
{
printf("accept error!\n");
return -1;
}
else
{
iClientNum++;
printf("Get connected from client %d: %s\n", iClientNum, inet_ntoa(tSocketClientAddr.sin_addr));
//fork()函数通过系统调用创建一个与原来进程几乎完全相同的子进程,创建成功返回0,失败返回<0,即fork()==0为子进程代码
//fork()>0为原父进程代码
if (!fork())
{
/* 子进程的源码 */
while (1)
{
iRecvLen = recv(iSocketClientFd, ucRecvBuf, 999, 0);
if (iRecvLen <= 0)
{
close(iSocketClientFd);
return -1;
}
else
{
ucRecvBuf[iRecvLen] = '\0';
printf("Get Msg From Client %d: %s\n", iClientNum, ucRecvBuf);
}
}
}
}
}
return 0;
}