linux c并发服务器,Linux C基于进程并发的服务器简单示例

// server

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#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

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值