服务器可以接受一客户端发送的数据,但转发时,另一个客户端接受不到数据

w20011025 2010-10-21 10:10:21
服务器程序代码可以接受一客户端程序,但转发时,另一客户端收不到数据?

#include <stdio.h>
#include <winsock2.h>
#include <time.h>
#include <memory.h>
#include "process.h"
typedef unsigned char BYTE;
typedef BYTE near *PBYTE;//PBYTE
#pragma comment(lib,"ws2_32.lib")
#define MAXLENGTH (180*1024)
SOCKET s=0;
#define RecvBufSize (8*1024)
#define MAX_BUFFER_SIZE (8*1024)
bool flagFinish=false;//数据是否发送完成标志
unsigned char *bufCom=new unsigned char[MAXLENGTH];

HANDLE g_evtSend = NULL;
unsigned DataLen=0;//数据段长度
////////////////////////
int SendData(SOCKET m_socketClient,PBYTE pData,UINT size)
{
try
{
long dwRet=0;
long dwTotalSize=0,dwSize=0,dwBufSize=0;
dwTotalSize=(long)size;
char* szXML=new char[size];
CopyMemory(szXML,pData,size);

for(dwSize=0;dwSize<dwTotalSize;)
{
if((dwTotalSize-dwSize)>=MAX_BUFFER_SIZE)
dwBufSize=MAX_BUFFER_SIZE;
else
dwBufSize=dwTotalSize-dwSize;

dwBufSize = send(m_socketClient,(char*)szXML+dwSize,dwBufSize,0);//发送8192K字节数据
if(dwBufSize==SOCKET_ERROR)
{
delete[] szXML;
return -1;
}
dwSize+=dwBufSize;
}

delete[] szXML;
}
catch(...)
{
return -1;
}

return 0;
}
//UINT WINAPI RevThread(LPVOID lpParam)//_beginthreadex(NULL,0,RevThread,&sockAccept,0,NULL);//接受线程
void RevThread(LPVOID lpParam)
{
SOCKET sockServer = (SOCKET)lpParam;
int ret;
char bufTemp[RecvBufSize];
unsigned PacketLen=0;//包长度

fd_set readSet;
timeval tv;
memset(&tv,0,sizeof(tv));
tv.tv_sec=15;//读取数据时间不超过15秒

while(1)//2.连接一直保持,不停的接受连接的数据 检查有无数据,15秒无数据可读,只返回
{
FD_ZERO(&readSet);
FD_SET(sockServer,&readSet);
ret=select(0,&readSet,NULL,NULL,&tv);//检查有无数据,15秒无数据可读,只返回
if(ret==SOCKET_ERROR)
{
printf("Socket %d: Select error (%d) !\n",sockServer,WSAGetLastError());//20101013
closesocket(sockServer);Sleep(1000);
break;
}
if(ret==0)
{
printf("Socket %d: Select Timeout (%d) !\n",sockServer,WSAGetLastError());//20101013
closesocket(sockServer);Sleep(1000);
break;
}
if(FD_ISSET(sockServer,&readSet))
{
ret=recv(sockServer,bufTemp,RecvBufSize,0);
if(ret==SOCKET_ERROR)
{
closesocket(sockServer);
continue;
}
unsigned int ULen=0;//得到包长度
((BYTE*)(&ULen))[0]=bufTemp[3];
((BYTE*)(&ULen))[1]=bufTemp[2];
((BYTE*)(&ULen))[2]=bufTemp[1];
((BYTE*)(&ULen))[3]=bufTemp[0];

//buf=new unsigned char[ULen+2048]; //unsigned char *buf
unsigned char *buf=new unsigned char[ULen+2048];
memset(buf,0,ULen+2048);
memcpy(buf,bufTemp,ret);
PacketLen+=ret;

while (PacketLen<ULen)//3.******
{
ret=recv(sockServer,bufTemp,RecvBufSize,0);
memcpy(buf+PacketLen,bufTemp,ret);//注意复制的长度// memcpy(buf+ret,bufTemp,ret);
PacketLen+=ret;
printf("Socket %d recv: %d\n",sockServer,PacketLen);//20101013
}
//{{{
PBYTE p=(unsigned char *)buf;
/*2. IBM big-endian **********/
float fDistance=0.0;//距离
float fTemperture=0.0;//温度
float fChannel=0.0;//通道号*(float*)&p[5];
((BYTE*)(&fChannel))[0]=p[8]; //通道号,接受第一个通道数据正常,第二,三个通道数据错误
((BYTE*)(&fChannel))[1]=p[7];
((BYTE*)(&fChannel))[2]=p[6];
((BYTE*)(&fChannel))[3]=p[5];
SendData(sockServer,buf,sizeof(buf+4));
memcpy(bufCom,buf,ULen+2048);//20101019
DataLen=ULen;//数据段长度
delete[] buf;
PacketLen=0;//数据接受完成后 包长度清0


}
}
return ;//return 1;
}

//接受线程UINT WINAPI SendtoClientThread(void *pParam)
//UINT WINAPI SendThread(LPVOID lpParam)
/*//////////////////测试数据
FILE *stream;
int numread;
unsigned char g_hSendTempData[124911]={0x00,0x00,0x00,0x25, 0x00, 0x00,0x00,0x00,0x00,
0x3F,0x80,0x00,0x00, 0x41,0x2C,0x00,0x00, 0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x01,
0x40,0x00,0x00,0x00, 0x41,0xA6,0x00,0x00, 0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x01,
0x12,0x34,0x56,0x78, 0x5A,0x5A};//0通道200*1024
*/ ///////////////////////////////

void SendThread(LPVOID lpParam)
{
SOCKET sockServer = (SOCKET)lpParam;
int ret=0;
int nRet=0;
unsigned PacketLen=0;//包长度

fd_set writeSet;
timeval tv;
memset(&tv,0,sizeof(tv));
tv.tv_sec=5;//读取数据时间不超过5秒

while(1)
{
FD_ZERO(&writeSet);
FD_SET(sockServer,&writeSet);
ret=select(0,NULL,&writeSet,NULL,&tv);//发送数据
printf("Socket %d: Send1 !\n",sockServer);//1
if(ret==SOCKET_ERROR)
{
printf("Socket %d: Select error (%d) !\n",sockServer,WSAGetLastError());
closesocket(sockServer);Sleep(1000);
break;
}
if(ret==0)
{
printf("Socket %d: Select Timeout (%d) !\n",sockServer,WSAGetLastError());
closesocket(sockServer);Sleep(1000);
break;
}
if(FD_ISSET(sockServer,&writeSet))
{
printf("Socket %d: Send2 !\n",sockServer);
//1{{{{{{{{{{{{{{{{{
while(1)
{
/* 1 20101019{{{{
char sendBuf[100];
sprintf (sendBuf,"Welcome http://blog.csdn.net/teshorse");
send(sockServer,sendBuf,strlen(sendBuf)+1,0);
printf("Test\n");*/
/* 测试发送成功2
if( (stream = fopen( "F:\\rec1.bin", "rb" )) != NULL )
{
numread = fread( g_hSendTempData, sizeof( unsigned char ), 124911, stream );
printf( "1 Number of items read = %d\n", numread );
fclose( stream );
}
nRet = SendData(sockServer,g_hSendTempData,sizeof(g_hSendTempData));
Sleep(4000000);
*/
////}}}}}
nRet = SendData(sockServer,bufCom,DataLen+4);
Sleep(1000);
}
printf("Socket %d: Send2 !\n",sockServer);

if(ret==SOCKET_ERROR)
{
closesocket(sockServer);
break;//continue;
}
}
}
return ;//return 1;
}
int main()
{
memset(bufCom,0,MAXLENGTH);
g_evtSend = CreateEvent(NULL,FALSE,FALSE,"g_evtSend_73eufefgheyefuf9efuef9_45");
if(g_evtSend)printf("Success\n");
else return 0;
//////////////////
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return 0;//printf("%d\n",err);
}
if((LOBYTE(wsaData.wVersion) !=1) || (HIBYTE(wsaData.wVersion) !=1))
{
WSACleanup();
return 0;
}
SOCKET sockListen=socket(AF_INET,SOCK_STREAM,0);
// bool bReuseAddr=true;
// setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)bReuseAddr,sizeof(bReuseAddr));
struct sockaddr_in local;
memset(&local,0,sizeof(local));
local.sin_addr.s_addr=INADDR_ANY;
local.sin_family=AF_INET;
local.sin_port=htons(8801);
if(bind(sockListen,(struct sockaddr *)&local,sizeof(local))==SOCKET_ERROR)
{
printf("bind:%d\n",WSAGetLastError());
closesocket(sockListen);
WSACleanup();
return -1;
}
if(listen(sockListen,5)==SOCKET_ERROR)
{
printf("listen:%d\n",WSAGetLastError());
closesocket(sockListen);
WSACleanup();
return -1;
}
///////////////////////////
struct sockaddr_in addrClient;
int len=sizeof(addrClient);//sizeof(SOCKADDR);
////////////
SOCKET sockAccept;
while(true)
{
sockAccept=accept(sockListen,(SOCKADDR *)&addrClient,&len);
if(sockAccept==INVALID_SOCKET)
{ //break;
continue;
}
getpeername(sockListen, (struct sockaddr *)&addrClient,&len);
if(!strcmp(inet_ntoa(addrClient.sin_addr),"192.168.1.2"))//INI,读取指定文件系统
{
// printf("%s same\n",inet_ntoa(addrClient.sin_addr));
// _beginthreadex(NULL,0,RevThread,&sockAccept,0,NULL); //创建接受线程
_beginthread(RevThread,0,(LPVOID)sockAccept);
// _beginthread(SendThread,0,(LPVOID)sockAccept);
}
else
{
// _beginthreadex(NULL,0,SendThread,&sockAccept,0,NULL);//创建发送线程
_beginthread(SendThread,0,(LPVOID)sockAccept);
}
}
delete[] bufCom;
return 0;
}



...全文
192 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lei35151 2010-10-22
  • 打赏
  • 举报
回复
首先你要确认转发的客户端跟你接受数据的服务端是否有建立连接
如果连接都没建立,肯定是不能发送了
LENOVO_ 2010-10-22
  • 打赏
  • 举报
回复

TCP 是基于连接的传输协议,传输数据前先要建立连接。

你说想转发,所以转发前你服务器这边要用 connect 连接那个客户端。成功后才可以传输。

按你的要求使用 UDP 很好。

按 IP + 端口 转发到指定的客户端。
w20011025 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lei35151 的回复:]
首先你要确认转发的客户端跟你接受数据的服务端是否有建立连接
如果连接都没建立,肯定是不能发送了
[/Quote]
可以接受,发送数据,
但现在服务器想等待客户端发送数据完整后在发送到其他客户端。?
用事件还是其他,如何改好呢,谢谢。
傻X 2010-10-21
  • 打赏
  • 举报
回复
((BYTE*)(&fChannel))[3]=p[5];
SendData(sockServer,buf,sizeof(buf+4));
memcpy(bufCom,buf,ULen+2048);//20101019


这个是啥?服务器自己发自己么?你sockServer是自己啊...你重新建个socket...发送地址要改啊.
w20011025 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q342210738 的回复:]
貌似程序很长啊
[/Quote]
你看主要问题就行了。
lyingbo 2010-10-21
  • 打赏
  • 举报
回复
貌似程序很长啊
w20011025 2010-10-21
  • 打赏
  • 举报
回复
可以接受,发送数据,
但现在想等待接受客户端数据完整后在发送到其他客户端。?
用事件还是其他,如何改好呢,谢谢。
w20011025 2010-10-21
  • 打赏
  • 举报
回复
客户端接受不到数据,不知道哪地方出了问题,请各位帮忙看下?

#include <stdio.h>
#include <WINSOCK2.H>
#pragma comment(lib,"ws2_32.lib")
SOCKET g_sockClient=INVALID_SOCKET;

#define MAXLENGTH (180*1024)
#define RecvBufSize (8*1024)

int main(int argc,char *argv[])
{
try
{
ReStart:
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {return 0; }//endof if
//判断是否我们请求的winsocket版本,如果不是
//则调用WSACleanup终止winsocket的使用并返回
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{ WSACleanup( ); return 0; }///endof if

g_sockClient=socket(AF_INET,SOCK_STREAM,0);
if(g_sockClient==INVALID_SOCKET)
{
WSACleanup();
return -1;
}
struct sockaddr_in to ;
memset(&to,0,sizeof(to));
to.sin_addr.s_addr=inet_addr("192.168.1.2");//destAddr;
to.sin_family=AF_INET;
to.sin_port=htons(8801);//nPort;
// printf("connecting %s:8801......",inet_ntoa(to.sin_addr));//%dvnPort
ReLink:
if(connect(g_sockClient,(struct sockaddr *)&to,sizeof(to))==SOCKET_ERROR)
{
if(g_sockClient!=INVALID_SOCKET)
closesocket(g_sockClient);
printf("Faild.(connect %d)\n",WSAGetLastError());
WSACleanup();
/////{{{{{{{{{{
Sleep(3000);//3秒后重新连接
goto ReLink;
/////}}}}}}}}}}
return -1;
}//else printf("Successfully.\n ");
unsigned PacketLen=0;//包长度
char bufTemp[RecvBufSize];
fd_set readSet;
struct timeval tv;
int ret;//len,

while(1)
{
FD_ZERO(&readSet);
FD_SET(g_sockClient,&readSet);
tv.tv_sec=15;
tv.tv_usec=0;
ret=select(0,&readSet,NULL,NULL,&tv);
if(ret==SOCKET_ERROR)//CASE 1:select Error
{
printf("select: %d\n",WSAGetLastError());
break;
}
if(ret==0)//CASE 2:select TimeOut
{
printf("Timeout,No Response From Server.\n");
continue; // break;
}
if(FD_ISSET(g_sockClient,&readSet))//CASE 3:select OK
{
memset(bufTemp,0,1024*8);
//20101019{{{{{{{{{{{{{{{{{{{{{
// ret=recv(g_sockClient,bufTemp,1024,0);
// if(ret==SOCKET_ERROR)
// {
// printf("recv: %d\n",WSAGetLastError());
// break;
// }////////////}}}}}}}}}}}}}}}}}}}}
//else //////////接受数据处理20101019{{{{{{{
//////////////////////////////////////////printf("%d %s\n",ret, bufTemp);
ret=recv(g_sockClient,bufTemp,RecvBufSize,0);
if(ret==SOCKET_ERROR)
{
closesocket(g_sockClient);
break;//continue;
}
unsigned int ULen=0;//得到包长度
((BYTE*)(&ULen))[0]=bufTemp[3];
((BYTE*)(&ULen))[1]=bufTemp[2];
((BYTE*)(&ULen))[2]=bufTemp[1];
((BYTE*)(&ULen))[3]=bufTemp[0];

unsigned char *buf=new unsigned char[ULen+2048];
memset(buf,0,ULen+2048);
memcpy(buf,bufTemp,ret);
PacketLen+=ret;

while (PacketLen<ULen)//3.******
{
ret=recv(g_sockClient,bufTemp,RecvBufSize,0);
memcpy(buf+PacketLen,bufTemp,ret);//注意复制的长度// memcpy(buf+ret,bufTemp,ret);
PacketLen+=ret;
printf("Socket %d recv: %d\n",g_sockClient,PacketLen);//20101013
}
//{{{
PBYTE p=(unsigned char *)buf;
/*2. IBM big-endian **********/
float fDistance=0.0;//距离
float fTemperture=0.0;//温度
float fChannel=0.0;//通道号*(float*)&p[5];
((BYTE*)(&fChannel))[0]=p[8]; //通道号,接受第一个通道数据正常,第二,三个通道数据错误
((BYTE*)(&fChannel))[1]=p[7];
((BYTE*)(&fChannel))[2]=p[6];
((BYTE*)(&fChannel))[3]=p[5];
for(unsigned int i=9;i<ULen+4;i+=16) //IBM big-endian
{
((BYTE*)(&fDistance))[0]=p[i+3];
((BYTE*)(&fDistance))[1]=p[i+2];
((BYTE*)(&fDistance))[2]=p[i+1];
((BYTE*)(&fDistance))[3]=p[i];

((BYTE*)(&fTemperture))[0]=p[i+3+4];
((BYTE*)(&fTemperture))[1]=p[i+2+4];
((BYTE*)(&fTemperture))[2]=p[i+1+4];
((BYTE*)(&fTemperture))[3]=p[i+4];

printf("%.8f %.8f\n",fDistance,fTemperture);
}
delete[] buf;
PacketLen=0;//数据接受完成后 包长度清0
//////////////////////////////
////////////////////////}}}}}}}}}
}
}
if(g_sockClient!=INVALID_SOCKET) closesocket(g_sockClient);
WSACleanup();//printf("Stopped.\n");
goto ReStart; Sleep(3000);//重新开始连接服务器
}
catch(...)
{
return 0;
}
return 0;
}

服务器必须接受一客户端发送的数据完成后,才能转发给其他客户端,?
w20011025 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tiger9991 的回复:]
((BYTE*)(&fChannel))[3]=p[5];
SendData(sockServer,buf,sizeof(buf+4));
memcpy(bufCom,buf,ULen+2048);//20101019


这个是啥?服务器自己发自己么?你sockServer是自己啊...你重新建个socket...发送地址要改啊.
[/Quote]想模拟发送数据

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧