对于看到很多人提出的基于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)
{