基于C客户端与多个服务器相连

对于看到很多人提出的基于C客户端与多个服务器相连的问题,我进行了具体的总结,附有源码,直接可以运行,不足之处还望大家指点!

这样的程序其实就是一个中间代理。

你可以把它想成:他就是一个拥有服务器的功能又有客户端的作用

难点在于充当客户端时怎么连接多个服务器----------------------------------------多线程的模式---------------------------几个服务器开启几个线程用于并行交互式传输数据

#include "px.h" 









/*
function:   Net_Read()
description:
            读通信数据
Input:
            date_fd:描述符
            chReadBuffer:需读入的缓冲区
            iSize:需读入的字节数
Output:
Return:     0:成功,other:不成功
others:
*/
int Net_Read(int date_fd, void *chReadBuffer, int iSize)
{
int iRcode;
int iHandle;
int iLeft;
char *pchBuffer;
iHandle = date_fd;
iLeft = iSize;
pchBuffer =(char *)chReadBuffer;
if(0 == iSize)
{
pchBuffer[0] = '\0';
return 0;
}


while(iLeft > 0)
{
iRcode = read(iHandle, pchBuffer, iLeft);
if(iRcode == 0)
{
printf("read wrong \n" );
return -1;
}
if(iRcode == -1)
{
if(errno == EINTR)
{
iRcode = 0;
}
else
{
return -1;
}
}
iLeft =iLeft - iRcode;
pchBuffer = pchBuffer + iRcode;


}
pchBuffer[iSize] = '\0';
return iSize;
}
/*
function:   Net_Write()
description:
            读通信数据
Input:
    date_fd :描述符
            chWriteBuffer:需写入的缓冲区
            iSize:写读入的字节数
Output:
Return:     0:成功,other:不成功
others:
*/
int Net_Write(int date_fd, const void *chWriteBuffer, int iSize)
{
int iRcode;
int iHandle;
int iLeft;
char *pchBuffer;
int len;
if(0 == iSize)
{
return 0;
}
iHandle = date_fd;
pchBuffer = (char *)chWriteBuffer;
iLeft = iSize;


while(iLeft > 0)
{
iRcode = write(iHandle, pchBuffer, iLeft);
if(iRcode == 0)
{
printf("Net_Write error\n");
return -1;
}
if(iRcode == -1)
{
if(errno == EINTR)
{
iRcode = 0;
}
else
{
return -1;
}
}


iLeft = iLeft - iRcode;
pchBuffer = pchBuffer + iRcode;
}


return iSize;
}
extern "C"
void * dealAcceptRecv(void * p)
{
stNet_AcceptNetInfo *AcceptNetInfo = (stNet_AcceptNetInfo *)p;
char buf[1024];
memset(buf,0,sizeof(buf));
int res;
int AcceptFd;
AcceptFd = AcceptNetInfo->iAcceptFd;
struct packetbody recvbufbody;
//struct packet recvbuf;
while(1)
{
memset(&recvbufbody, 0, sizeof(recvbufbody));
res = Net_Read(AcceptFd, &recvbufbody.recvbuf, 4);
if (res < 4)   //客户端关闭  
{  
printf("client close\n");  
break;  
}
res = Net_Read(AcceptFd, recvbufbody.bodybuf, recvbufbody.recvbuf.len);
//int len = atoi(recvbuf.lenbuf);

/*res = read(AcceptFd,buf,DATESIZE); 
if(res == 0)
{
printf("read wrong \n" );
return NULL;
}
if(res<0 && errno!=EAGAIN)
{
perror("read");
}*/
printf("read buf is -----%s\n",recvbufbody.bodybuf);
}  

/*while ( 1 )
{
res=read(AcceptFd,buf,DATESIZE);


if(res == 0)
{
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值