// server
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#include"time.h"
#define SERVER_PORT 10000
#define MAX_BUF_SIZE 16
#define SUCCESS 0
#define FAILURE -1
int RecvFromServer(int iClientSockFd);
int main(int argc, char **argv)
{
int iServerSockFd;
int iClientSockFd;
struct sockaddr_in stServerAddr;
struct sockaddr_in stClientAddr;
int iServerLen;
int iClientLen;
int iOpt =1;
int iReturn;
pid_t pid;
// time
time_t timer;
struct tm *tblock;
timer = time(NULL);
tblock= localtime(&timer);
printf("servertime is %s",asctime(tblock));
printf("This is the Server.\n");
printf("I am waiting the client to rsync time \n");
// create server socket
iServerSockFd = socket(AF_INET, SOCK_STREAM, 0);
if (iServerSockFd < 0)
{
printf("socket create failed in CommManageServerRecvThread.\n");
return FAILURE;
}
stServerAddr.sin_family = AF_INET;
stServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
stServerAddr.sin_port = htons(SERVER_PORT);
iServerLen = sizeof(stServerAddr);
// bind socket
iReturn = bind(iServerSockFd, (struct sockaddr *)&stServerAddr, iServerLen);
if (iReturn < 0)
{
printf("socket bind failed in CommManageServerRecvThread.\n");
}
setsockopt(iServerSockFd,SOL_SOCKET,SO_REUSEADDR,&iOpt,sizeof(iOpt));
// listen socket
iReturn = listen(iServerSockFd, 10);
// accept request from client
while(1)
{
iClientSockFd = accept(iServerSockFd, (struct sockaddr*)&stClientAddr, (unsigned *)&iClientLen);
if (iServerSockFd < 0)
{
printf("accept failed.\n");
}
pid = fork();
switch(pid)
{
case -1:
{
printf("fork failed.\n");
break;
}
case 0:
{
write(iClientSockFd,asctime(tblock),30);
printf("child service ok!!\n");
close(iClientSockFd);
break;
}
default:
{
close(iClientSockFd);
break;
}
}
}
close(iClientSockFd);
close(iServerSockFd);
return SUCCESS;
}
int RecvFromServer(int iClientSockFd)
{
char acBuf[MAX_BUF_SIZE];
int iReadNum;
memset(acBuf, 0, sizeof(acBuf));
iReadNum = recv(iClientSockFd, acBuf, 0xFFFF, 0);
if(iReadNum < 0)
{
printf("read failed.\n");
return FAILURE;
}
printf("Receive form client:\n");
printf("%s\n", acBuf);
return SUCCESS;
}
// client
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#define SERVER_PORT 10000
#define SERVER_IP "192.168.0.112"
#define WRITE_BUF_SIZE 1024
#define SUCCESS 0
#define FAILURE -1
char acBuf[WRITE_BUF_SIZE];
int my_read(int fd,void *buffer,int length)
{
int bytes_left;
int bytes_read;
char *ptr;
bytes_left=length;
ptr=buffer;
while(bytes_left>0)
{
bytes_read=read(fd,ptr,bytes_left);
if(bytes_read<0)
{
if(errno==EINTR)
bytes_read=0;
else
return -1;
}
else
if(bytes_read==0)
break;
bytes_left -= bytes_read;
ptr+=bytes_read;
}
return(length-bytes_left);
}
int main(int argc, char **argv)
{
int iSockFd;
int iReadNum;
struct sockaddr_in stServerAddr;
struct sockaddr_in stClientAddr;
int iServerLen;
int iClientLen;
int iReturn;
printf("This is the client.\n");
// create server socket
iSockFd = socket(AF_INET, SOCK_STREAM, 0);
if (iSockFd < 0)
{
printf("socket create failed in CommManageServerRecvThread.\n");
return FAILURE;
}
stServerAddr.sin_family = AF_INET;
inet_pton(AF_INET, SERVER_IP, &stServerAddr.sin_addr);
stServerAddr.sin_port = htons(SERVER_PORT);
iServerLen = sizeof(stServerAddr);
while(1)
{
//printf("try to connect to the server... ...\n");
iReturn = connect(iSockFd, (const struct sockaddr *)&stServerAddr, iServerLen);
if(iReturn >= 0)
{
break;
}
sleep(3);
}
printf("connect SUCCESS.\n");
memset(acBuf, 0, sizeof(acBuf));
my_read(iSockFd, acBuf, 30);
printf("%s\n",acBuf);
close(iSockFd);
return SUCCESS;
}
Linux C基于进程并发的服务器简单示例
点赞
收藏