socket如何实现代理传输

奕诚 2014-12-08 04:21:44
如题,
客户端A<--->(serveA) my app (clientB)<---> 服务端B
my app程序本身充当客户端A和服务端B之间数据传输的介质,收到客户端A发过来的数据就转发给服务端B,接收到B返回的数据就转发给客户端A。 网上说这是sock 穿透代理功能? 具体如何实现?谢谢
my app 部分我定义为客户端(也有服务端线程),连接服务端B,与服务端B通信,再转发A。目前我已实现接收到A的数据并且顺利转发给B,但是recv接收到B返回的数据比实际数据缺失几十个字节长度,也设置过接收超时,发送缓存大小等等,接收到的数据还是不全。(TCP/IP协议 socket通信)
...全文
2101 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
奕诚 2014-12-09
  • 打赏
  • 举报
回复
引用 7 楼 xihu1364 的回复:
如果加while循环继续recv就返回-1 GetLastError值是多少?
GetLastError值10060 WSAETIMEDOUT 我自己弄了个测试用的服务端B,返回数据没问题哦

// Server.cpp : Defines the entry point for the console application.
//

#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
	const int BUF_SIZE = 1024;
	WSADATA			wsd;			//WSADATA变量
	SOCKET			sServer;		//服务器套接字
	SOCKET			sClient;		//客户端套接字
	SOCKADDR_IN		addrServ;;		//服务器地址
	char			buf[BUF_SIZE];	//接收数据缓冲区
	char			sendBuf[BUF_SIZE];//返回给客户端得数据
	int				retVal;			//返回值

	char			sendBuftmp[BUF_SIZE] = {0};
	//初始化套结字动态库
	if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
	{
		cout << "WSAStartup failed!" << endl;
		return 1;
	}
	
	//创建套接字
	sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	
	if(INVALID_SOCKET == sServer)
	{
		cout << "socket failed!" << endl;
		WSACleanup();//释放套接字资源;
		return  -1;
	}
	
	//服务器套接字地址 
	addrServ.sin_family = AF_INET;
	addrServ.sin_port = htons(9002);
	addrServ.sin_addr.s_addr = INADDR_ANY;		
	//绑定套接字
	retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
	if(SOCKET_ERROR == retVal)
	{	
		cout << "bind failed!" << endl;
		closesocket(sServer);	//关闭套接字
		WSACleanup();			//释放套接字资源;
		return -1;
	}
	
	//开始监听 
	retVal = listen(sServer, 1);
	if(SOCKET_ERROR == retVal)
	{
		cout << "listen failed!" << endl;		
		closesocket(sServer);	//关闭套接字
		WSACleanup();			//释放套接字资源;
		return -1;
	}
	
	//接受客户端请求
	sockaddr_in addrClient;
	int addrClientlen = sizeof(addrClient);
	sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);
	if(INVALID_SOCKET == sClient)
	{
		cout << "accept failed!" << endl;		
		closesocket(sServer);	//关闭套接字
		WSACleanup();			//释放套接字资源;
		return -1;
	}
	
	while(true)
	{
		//接收客户端数据
		ZeroMemory(buf, BUF_SIZE);
		retVal = recv(sClient, buf, BUF_SIZE, 0);
		if (SOCKET_ERROR == retVal)
		{
			cout << "recv failed!" << endl;		
			closesocket(sServer);	//关闭套接字
			closesocket(sClient);	//关闭套接字		
			WSACleanup();			//释放套接字资源;
			return -1;
		}
		if(buf[0] == 'q')
			break;
		cout << "客户端发送的数据: " << buf <<endl;
		
		//cout << "向客户端发送数据: " ;
		//cin >> sendBuf;
		memcpy(sendBuf,"00B8600042......",sizeof(sendBuf));
		AscToBcd(sendBuftmp,sendBuf,strlen("00B8600042......"));
		send(sClient, sendBuftmp, 186, 0);//返回186字节
	}
	
	//退出
	closesocket(sServer);	//关闭套接字
	closesocket(sClient);	//关闭套接字
	WSACleanup();			//释放套接字资源;
	
	return 0;
}
版主大哥 2014-12-09
  • 打赏
  • 举报
回复
如果加while循环继续recv就返回-1 GetLastError值是多少?
奕诚 2014-12-09
  • 打赏
  • 举报
回复
引用 5 楼 xihu1364 的回复:
楼主说的是中转 如果只是纯转发,就用2个socket,1个监听A,另外一个连接B recv A多少就send给B recv B多少就send给A
是的,初次要实现这功能,不知道叫中转,看见网上说代理以为是代理穿透什么的,专业术语不太懂。 recv A多少就send给B 这个没问题 recv B多少就send给A 这个问题出现在recv 到的长度比实际少(recv一次),如果加while循环继续recv就返回-1了然后send给A没问题
版主大哥 2014-12-09
  • 打赏
  • 举报
回复
楼主说的是中转 如果只是纯转发,就用2个socket,1个监听A,另外一个连接B recv A多少就send给B recv B多少就send给A
奕诚 2014-12-09
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
先看缺少的数据是哪些? 是不是接收时,没有处理对数据的长度 数据如果有chunk编码,是否正确处理
谢谢版主回复,缺少的数据就是报文的后面几十个字节,报文格式是 长度+数据,没有chunk编码,谢谢
奕诚 2014-12-09
  • 打赏
  • 举报
回复
引用 1 楼 pcradio 的回复:
不太清楚你的具体情况,数据在发送时,自定义包结构进行发送,包头带一个CRC校验码,以校验发送的数据是否正确,每次都收不全,估计还是在发送或者接收环节出了问题,少发或者少收了
谢谢你的回复,可能我描述的不够清楚,抱歉。 我发送的数据是字符数组来的,BCD码报文,简单发送十几个字节转发和接收没问题的,就是长度长了就有问题了,比如实际应该接收274字节的数据,实际只接收到250字节,网上说可设置发送缓冲区大一点,我设置过也是丢数据。我把字符数组封装结构体试试,谢谢! 另外,服务端B是别人的,我这边无法改动,我改动的部分只有“ (serveA) my app (clientB)”。客户端A我是用socket小工具发送的数据
oyljerry 2014-12-08
  • 打赏
  • 举报
回复
先看缺少的数据是哪些? 是不是接收时,没有处理对数据的长度 数据如果有chunk编码,是否正确处理
阿源是少年 2014-12-08
  • 打赏
  • 举报
回复
不太清楚你的具体情况,数据在发送时,自定义包结构进行发送,包头带一个CRC校验码,以校验发送的数据是否正确,每次都收不全,估计还是在发送或者接收环节出了问题,少发或者少收了

18,356

社区成员

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

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