/*
NAME
       socket - create an endpoint for communication

SYNOPSIS
       #include <sys/types.h>  
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);
       
RETURN VALUE
       On  success,  a  file  descriptor  for  the new socket is returned.  On
       error, -1 is returned, and errno is set appropriately.


NAME
       bind - bind a name to a socket

SYNOPSIS
       #include <sys/types.h>
       #include <sys/socket.h>

       int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

RETURN VALUE
       On  success,  zero is returned.  On error, -1 is returned, and errno is
       set appropriately.

NAME
       listen - listen for connections on a socket

SYNOPSIS
       #include <sys/types.h> 
       #include <sys/socket.h>

       int listen(int sockfd, int backlog);

RETURN VALUE
       On  success,  zero is returned.  On error, -1 is returned, and errno is
       set appropriately.

vim tcpserver.c
gcc -o tcpserver tcpserver.c
./tcpserver
netstat -ap|grep tcpserver
*/
#include <sys/types.h>   
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int mian()
{
	int skfd;//socket文件描述符 socket file description 
	socklen_t addrlen;
	int ret;
	char buff[20];
	
	struct sockaddr_in serveraddr,clientaddr;
	skfd = socket(AF_INEF,SOCK_STREAM,0);
	if(skfd<0)
	{
	  perror("socket");
	  return -1;	
	}
	//填充网络类型,端口号,ip地址
	serveraddr.sin_family = AF_INEF;//填充网络地址类型 IPv4
	serveraddr.sin_port = htons(55555);//注意 端口号是short htons是字节序转换
	serveraddr.sin_addr.s_addr = 0;//inet_addr(""0,0,0,0);写0表示绑定任意地址
	addrlen = sizeof(serveraddr);
	ret = bind(skfd,(struct sockaddr *)&serveraddr,addrlen);
	if(ret<0)
	{
	  perror("bind");
	  return -1;	
	}	
	ret = listen(skfd,5);//5表示可以同时连接客户端的数量
	if(ret<0)
	{
	  perror("listen");
	  return -1;	
	}
	while(1)
	{
		int clientfd;//client文件描述符 client file description 
		clientfd = accept(skfd,(struct sockaddr *)&clientaddr,&addrlen);
		
		if(clientfd<0)
		{
		  perror("accept");
		  return -1;	
		}
		printf("ret=%d,ip:%s,port:%d\n",clientfd,inet_ntao(clientaddr.sin_addr,ntohs(clientaddr.sin_port)));
		int recvlen=0;		
		if(clientfd>0)
		{
			while(1)
			{
				memset(buff,0,MSGLEN);
				recvlen = recv(clientfd,buff,10,0);
				if(recvlen==0)
				{
					printf("connect:%d closeed\n",clientfd);
					close(clientfd);
					break;		
				}
				printf("recvlen:%d,%s\n",recvlen,buff);
			}
		}
		close(skfd);
	}
}