TCP服务器接受一客户数据,转发问题? TCP服务器接受一客户数据,转发问题?TCP服务器接受一客户端发送的数据,把数据转发给其他多个客户端,请文如何做?给点提示,谢谢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果其它终端有登录到服务器,A终端在发起信息到B终端时,加上B终端的ID号或其它唯一值,再由服务器转发都可以 把所有登陆的客户端记录到服务器的一个数据结构中(比如Array,Map,List等),然后,要转发时遍历这个结构发送就是了 #include <stdio.h>#include <WINSOCK2.H>#include <process.h>#pragma comment(lib,"ws2_32.lib")void WorkThread(LPVOID lpParam){ SOCKET sockSvr=(SOCKET)lpParam; fd_set readSet; int ret; timeval tv; char buf[5000]; unsigned int PackLen=0;//20100930 while (1) { FD_ZERO(&readSet); FD_SET(sockSvr,&readSet); tv.tv_sec=15;//5; tv.tv_usec=0; ret=select(0,&readSet,NULL,NULL,&tv); if(ret==SOCKET_ERROR||ret==0) { printf("Select error (%d) or Timeout!\n",WSAGetLastError()); break;; } if (FD_ISSET(sockSvr,&readSet)) { memset(buf,0,5000); ret=recv(sockSvr,buf,5000,0); PackLen+=ret;//20100930 if(ret==SOCKET_ERROR || ret==0) { printf("recv error (%d) or Timeout!\n",WSAGetLastError()); break; } //printf("Socket %d recv: %s\n",sockSvr,buf); printf("Socket %d recv: %d\n",sockSvr,PackLen);//20100930 ret=send(sockSvr,buf,strlen(buf),0); if(ret==SOCKET_ERROR) break; } } closesocket(sockSvr);}int main(int argc,char *argv[]){ WSAData wsaData; WSAStartup(WINSOCK_VERSION,&wsaData); SOCKET sockListen=socket(AF_INET,SOCK_STREAM,0); bool bReuseAddr=true; setsockopt(sockListen,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; } SOCKET sockAccept; while(true) { sockAccept=accept(sockListen,NULL,NULL); if(sockAccept==INVALID_SOCKET) break; else _beginthread(WorkThread,0,(LPVOID)sockAccept); } closesocket(sockListen); WSACleanup(); return 0;}直接发送其他客户端,就没有数据了? 一下是伪代码,仅仅为了说明问题:初始化socket环境创建socketbindlisten--------------------------------------------------以上代码略----------------------------------------------------------CDWordArray socketArray;------------关键代码--------------------socket client = -1;client = accept(server,NULL,NULL);//将新连接的客户端添加到结构中socketArray.Add(client);-----------你的相关处理略----------------DWORD RecvThread(LPVOID lparam){ char buf[1024]; int len = recv(client,buf,1024,0); //遍历所有客户端,转发数据 for(int i=0;i<socketArray.GetCount();i++) { socket client = socketArray[i]; send(client,buf,len,0); }}以上仅仅是一些说明代码,仅供参考 vs2008下的mfc的comm控件 聊天程序中list control 双击后怎么获得该用户的IP 关于http的get 这样的结构如何用vector解决? 模式对话框和无模式对话框创建和使用上的区别? 在 子函数中 给一个指针变量分配空间 怎么做?? 我这么做对么? 开发VC下的Console程序,可以用MFC的socket封装吗? 无模式对话框assert failure 关于dll的卸载?在线等 高手不要吝啬 about ado 不显示删除回复显示所有回复显示星级回复显示得分回复 这段代码,为何在Win7下,VS2008环境调试不通过。无法打开Word文档 mfc做换肤功能
#include <stdio.h>
#include <WINSOCK2.H>
#include <process.h>#pragma comment(lib,"ws2_32.lib")void WorkThread(LPVOID lpParam)
{
SOCKET sockSvr=(SOCKET)lpParam;
fd_set readSet;
int ret;
timeval tv;
char buf[5000];
unsigned int PackLen=0;//20100930
while (1)
{
FD_ZERO(&readSet);
FD_SET(sockSvr,&readSet);
tv.tv_sec=15;//5;
tv.tv_usec=0;
ret=select(0,&readSet,NULL,NULL,&tv);
if(ret==SOCKET_ERROR||ret==0)
{
printf("Select error (%d) or Timeout!\n",WSAGetLastError());
break;;
}
if (FD_ISSET(sockSvr,&readSet))
{
memset(buf,0,5000);
ret=recv(sockSvr,buf,5000,0);
PackLen+=ret;//20100930
if(ret==SOCKET_ERROR || ret==0)
{
printf("recv error (%d) or Timeout!\n",WSAGetLastError());
break;
}
//printf("Socket %d recv: %s\n",sockSvr,buf);
printf("Socket %d recv: %d\n",sockSvr,PackLen);//20100930
ret=send(sockSvr,buf,strlen(buf),0);
if(ret==SOCKET_ERROR) break;
}
}
closesocket(sockSvr);
}int main(int argc,char *argv[])
{
WSAData wsaData;
WSAStartup(WINSOCK_VERSION,&wsaData); SOCKET sockListen=socket(AF_INET,SOCK_STREAM,0);
bool bReuseAddr=true;
setsockopt(sockListen,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;
} SOCKET sockAccept;
while(true)
{
sockAccept=accept(sockListen,NULL,NULL);
if(sockAccept==INVALID_SOCKET)
break;
else
_beginthread(WorkThread,0,(LPVOID)sockAccept);
}
closesocket(sockListen);
WSACleanup();
return 0;
}
直接发送其他客户端,就没有数据了?
创建socket
bind
listen
---------------------------------------
-----------以上代码略-------------------
---------------------------------------CDWordArray socketArray;------------关键代码--------------------
socket client = -1;
client = accept(server,NULL,NULL);
//将新连接的客户端添加到结构中
socketArray.Add(client);
-----------你的相关处理略----------------DWORD RecvThread(LPVOID lparam)
{
char buf[1024];
int len = recv(client,buf,1024,0);
//遍历所有客户端,转发数据
for(int i=0;i<socketArray.GetCount();i++)
{
socket client = socketArray[i];
send(client,buf,len,0);
}
}
以上仅仅是一些说明代码,仅供参考