最近在学SOCKET、tcp通信,怎么实现两个客户端通过一个服务端相互通信呢,求解答,谢谢

千年捞菜 2014-08-14 10:57:39
就是客户端C1发消息Message1给服务端S, S收到Message1后转发给客户端C2,然后C2发消息Message2给S,S最后把Message2转发给C1,这样实现C1和C2的通信,能给点思路或者代码吗,刚学这个,谢谢了
...全文
316 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪碧透心凉_ 2014-08-18
  • 打赏
  • 举报
回复
while(1) { ...... m_client[n]=appecpt(); } 收到的时候你可以知道是那个客户端发来的 吧他传给下面函数 假设是t for(int i=0;i<m_client.count();i++) { if(m_client[i]!=t) { send(m_client[i],...... } }
千年捞菜 2014-08-14
  • 打赏
  • 举报
回复
引用 5 楼 MrXiao95 的回复:
有客户端连接上来以后保存其套接字,收到任何一个就转发给其他的套接字
是在while(1)里面么处理么,如果是,你能给点详细代码吗,谢谢
雪碧透心凉_ 2014-08-14
  • 打赏
  • 举报
回复
有客户端连接上来以后保存其套接字,收到任何一个就转发给其他的套接字
千年捞菜 2014-08-14
  • 打赏
  • 举报
回复
引用 3 楼 a350277864 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 参考: MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.DSP MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLES.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\IOCTL.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\README.TXT MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\MAKEFILE
赵老师,上面的我看了下不太懂。能给一点服务端的代码么,看下我的服务端代码需要修改哪里?
/***************创建socket*******************/
int SD_DSC_SERVER_SOCKET(const char* address, unsigned int port)
{
	//初始化 WSA
	HANDLE hThread;
	WORD sockVersion = MAKEWORD(2,2);
	WSADATA wsaData;
	if(WSAStartup(sockVersion,&wsaData)!=0)
		return 0;
	//创建socket
	SOCKET ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(ServerSocket == INVALID_SOCKET)
	{
		cout<<"create socket error!"<<endl;
		return 0;
	}
	//设置 IP 端口号 。。。
	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(port);
	sin.sin_addr.s_addr = inet_addr(address);
	//绑定地址和端口号
	if(bind(ServerSocket,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
	{
		cout<<"bind error: address---"<<address<<" port---"<<port<<"   "<<GetLastError()<<endl;
		Sleep(5000);
		return 0;

	}
	//服务器监听
	if(listen(ServerSocket,100) == SOCKET_ERROR)
	{
		cout<<"listen error"<<"   "<<GetLastError()<<endl;
		return 0;
	}
	cout<<"服务端已经启动"<<endl<< "port:"<< port <<endl;
	//接收数据
	sockaddr_in remoteAddr;
	int nAddrlen = sizeof(remoteAddr);
	//char revData[1024];  
	while(1)
	{
		SOCKET ClientSocket = accept(ServerSocket,(SOCKADDR*)&remoteAddr, &nAddrlen);
		if(ClientSocket == INVALID_SOCKET)
		{
			cout<<"accept error"<<GetLastError()<<endl;
			return 0;
		}
		cout<< "connected one connection:" << inet_ntoa(remoteAddr.sin_addr) << " port:" <<port << endl;
		//recv data
		hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)ClientSocket, 0, NULL);
		/*
		recv(ClientSocket,recvchar,1024,0);
		cout<<"接收到客户端:"<< inet_ntoa(remoteAddr.sin_addr) << "的信息为:" << recvchar << endl;
		*/
		if ( hThread == NULL )	
		{
			cout<<"Create Thread Failed!"<<endl;
			break;
		}	
		CloseHandle(hThread);		
	}
	closesocket(ServerSocket);
	WSACleanup();
	return 0;

}
[/quote] 在while(1)循环里能接收到C1,C2的消息再及时转发给对方
千年捞菜 2014-08-14
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
参考: MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.DSP MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLES.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\IOCTL.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\README.TXT MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\MAKEFILE
赵老师,上面的我看了下不太懂。能给一点服务端的代码么,看下我的服务端代码需要修改哪里?
/***************创建socket*******************/
int SD_DSC_SERVER_SOCKET(const char* address, unsigned int port)
{
	//初始化 WSA
	HANDLE hThread;
	WORD sockVersion = MAKEWORD(2,2);
	WSADATA wsaData;
	if(WSAStartup(sockVersion,&wsaData)!=0)
		return 0;
	//创建socket
	SOCKET ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(ServerSocket == INVALID_SOCKET)
	{
		cout<<"create socket error!"<<endl;
		return 0;
	}
	//设置 IP 端口号 。。。
	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(port);
	sin.sin_addr.s_addr = inet_addr(address);
	//绑定地址和端口号
	if(bind(ServerSocket,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
	{
		cout<<"bind error: address---"<<address<<" port---"<<port<<"   "<<GetLastError()<<endl;
		Sleep(5000);
		return 0;

	}
	//服务器监听
	if(listen(ServerSocket,100) == SOCKET_ERROR)
	{
		cout<<"listen error"<<"   "<<GetLastError()<<endl;
		return 0;
	}
	cout<<"服务端已经启动"<<endl<< "port:"<< port <<endl;
	//接收数据
	sockaddr_in remoteAddr;
	int nAddrlen = sizeof(remoteAddr);
	//char revData[1024];  
	while(1)
	{
		SOCKET ClientSocket = accept(ServerSocket,(SOCKADDR*)&remoteAddr, &nAddrlen);
		if(ClientSocket == INVALID_SOCKET)
		{
			cout<<"accept error"<<GetLastError()<<endl;
			return 0;
		}
		cout<< "connected one connection:" << inet_ntoa(remoteAddr.sin_addr) << " port:" <<port << endl;
		//recv data
		hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)ClientSocket, 0, NULL);
		/*
		recv(ClientSocket,recvchar,1024,0);
		cout<<"接收到客户端:"<< inet_ntoa(remoteAddr.sin_addr) << "的信息为:" << recvchar << endl;
		*/
		if ( hThread == NULL )	
		{
			cout<<"Create Thread Failed!"<<endl;
			break;
		}	
		CloseHandle(hThread);		
	}
	closesocket(ServerSocket);
	WSACleanup();
	return 0;

}
JPF1024 2014-08-14
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
参考: MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.DSP MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLES.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\IOCTL.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\README.TXT MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\MAKEFILE
C++网络端一般用哪个库比较好?比如我去抓取一个网页回来分析。。坐等赵老师解答。。我用GCC。。没有VC。。
赵4老师 2014-08-14
  • 打赏
  • 举报
回复
参考: MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.DSP MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLES.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\IOCTL.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\README.TXT MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\MAKEFILE
风行踩火轮 2014-08-14
  • 打赏
  • 举报
回复
5楼的说法你就可以实现,在你的服务器端SOCKET ClientSocket = accept(ServerSocket,(SOCKADDR*)&remoteAddr, &nAddrlen)之后,将响应的socket进行保存,并且将用户信息和socket的对应关系确定下来,然后按照你的需求进行转发就可以了
赵4老师 2014-08-14
  • 打赏
  • 举报
回复
先搜索、下载、安装MSDN98,再参考: MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\WSOCK.DSP MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\WSOCK.RES MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\WSOCK.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\WSOCK.H MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\WSOCK.RC MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\DIALOGS.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\README.TXT MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\MAKEFILE MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\WSOCK.ICO MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\WSOCK.DLG MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\WSOCK\WSOCK.DEF

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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