/**
* Tcp Server program, It is a simple example only.
* zhengsh 200520602061 2
* when client connect to server, send a welcome message and timestamp in server.
*/
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#include <arpa/inet.h>
#define SERVER_PORT 20000 // define the defualt connect port id
#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
#define BUFFER_SIZE 255
#define WELCOME_MESSAGE "welcome to connect the server. "
int main(int argc, char **argv)
{
printf("ok...\n");
int servfd, clifd;
struct sockaddr_in servaddr,cliaddr;
if ((servfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("create socket error!\n");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
int flag=1,len=sizeof(int);
if( setsockopt(servfd, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1)
{
perror("setsockopt\n");
exit(1);
}
if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{
printf("bind to port %d failure!\n",SERVER_PORT);
exit(1);
}
if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0)
{
printf("call listen failure!\n");
exit(1);
}
while (1)
{
//server loop will nerver exit unless any body kill the process
char buf[BUFFER_SIZE];
long timestamp;
socklen_t length = sizeof(cliaddr);
printf("accept 1 ...\n");
clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);
printf("accept 2...\n");
if (clifd < 0)
{
printf("error comes when call accept!\n");
break;
}
printf("accept 3...\n");
strcpy(buf,WELCOME_MESSAGE);
//inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);
printf("accept 4...\n");
printf("from client,IP:%s,Port:%d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
timestamp = time(NULL);
strcat(buf,"timestamp in server:");
strcat(buf,ctime(×tamp));
printf("send : [%s]\n", buf);
send(clifd,buf,BUFFER_SIZE,0);
char buf2[200] = { 0 };
recv(clifd, buf2, 200, 0);
printf("buf2:[%s]\r\n", buf2);
sleep(30);
close(clifd);
}//exit
printf("exit...\n");
close(servfd);
return 0;
}