代理服务器代理端向服务端recv()之后总出现的10054错误

我杰尼龟怕你不成 2014-10-27 04:23:53
代理端:
#include "StdAfx.h"
#include "ProxyS.h"
#include <process.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

CProxyS* pThis=NULL;

CProxyS::CProxyS(void)
{
WSADATA wasData;
WSAStartup(MAKEWORD(2,2),&wasData);
this->m_pWndView = NULL;
this->socketManager=SOCKET_ERROR;
pThis=this;
}

CProxyS::~CProxyS(void)
{
WSACleanup();
}


VOID CProxyS::OnPostNotif(TCHAR* szNotif)
{
//通知些显示消息
if(this->m_pWndView != NULL)
{
this->m_pWndView->SendMessage(NOTIF_MSG_SHOW, (WPARAM)szNotif);
}
}



BOOL CProxyS::OnStartServerListen(UINT nPort) //启动服务器线程
{

HANDLE hServer = (HANDLE)_beginthreadex( NULL,
NULL,
this->ServerListenProc,
(LPVOID)nPort,
NULL,
NULL
);
if(NULL==hServer)
{
return FALSE;
}
return TRUE;
}


unsigned WINAPI CProxyS::ServerListenProc(LPVOID lpVoid)
{
SOCKET ProxyServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(SOCKET_ERROR==ProxyServer)
{
pThis->OnPostNotif(_T("Server socket init error!"));
return 1;
}

struct sockaddr_in srvaddr;
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons((UINT)lpVoid);
srvaddr.sin_addr.S_un.S_addr=INADDR_ANY;
if(bind(ProxyServer,(LPSOCKADDR)&srvaddr,sizeof(SOCKADDR))==SOCKET_ERROR)
{
pThis->OnPostNotif(_T("Server socket bind error!"));
return 1;
}
if(listen(ProxyServer,DEFLISNUM)==SOCKET_ERROR)
{
pThis->OnPostNotif(_T("Server socket listen error!"));
return 1;
}
pThis->OnPostNotif(_T("监听成功"));
sockaddr_in addrRemote;
int len=sizeof(sockaddr);
while(1)
{
SOCKET acceptSocket=accept(ProxyServer,(sockaddr*)&addrRemote,&len);
if(SOCKET_ERROR==acceptSocket)
{
break;
}
CHAR *sIP=inet_ntoa(addrRemote.sin_addr); //得到客户端IP
pThis->OnPostNotif(_T("收到一个IE连接,IP:"));
pThis->ServerReceive(acceptSocket);
}
return 0;
}

VOID CProxyS::ServerReceive(SOCKET ServerSocket)
{
char bufferdata[MAXBUFSIZE];
memset(bufferdata,0,MAXBUFSIZE);
//接收客户端发来的请求
int nRecvLen = recv(ServerSocket,bufferdata,MAXBUFSIZE, 0);
if(nRecvLen==0)
{
closesocket(ServerSocket);
return;
}
// 向WebServer提交请求
SOCKADDR_IN saServer;
SOCKET hsocket;
int nRet;
hsocket = socket(AF_INET,SOCK_STREAM,0);
if(hsocket==INVALID_SOCKET)
{
//printf("Failed socket(),error code:%d\n",WSAGetLastError());
return;
}
saServer.sin_family = AF_INET;
saServer.sin_port = htons(8080);
saServer.sin_addr.S_un.S_addr=inet_addr(bufferdata);//= *((LPIN_ADDR)*lphostent->h_addr_list);
CHAR *wIP=inet_ntoa(saServer.sin_addr);
nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));
if(nRet==SOCKET_ERROR)
{
closesocket(hsocket);
return;
}
// 向webserver转发IE请求
nRet = TCPsend(hsocket,bufferdata,strlen(bufferdata),0);
char dest[MAXBUFSIZE];
memset(dest,0,MAXBUFSIZE);
nRet=TCPrecv(hsocket,dest,MAXBUFSIZE,0); //断点测试出错,总返回1
int e=WSAGetLastError(); //e=10053
nRet=1;
int senlen=0;
while(nRet>0)
{
memset(dest,0,1000);
nRet=recv(hsocket,dest,sizeof(dest)-1,0); // 从webserver获取数据
if(nRet==0)
{
break;
}
else if(nRet==SOCKET_ERROR )
{
break;
}
dest[nRet]='\0';
//将数据转发给客户端
senlen = TCPsend(ServerSocket,dest,nRet,0);
if(senlen==0)
{
sockaddr_in sin;
int len = sizeof(sin);
if(getpeername(ServerSocket,(sockaddr*)&sin,&len)== SOCKET_ERROR)
{
//break;
}
// break;
}
else if(senlen==SOCKET_ERROR)
{
//break;
}
}
closesocket(ServerSocket);
closesocket(hsocket);
}

int CProxyS::TCPsend(SOCKET s,const char*buf,int len,int flags)
{
int n=0,sendCount=0;
int length =len;
if(buf==NULL)
return 0;
while(length>0)
{
n=send(s,buf+sendCount,length,flags); //发送数据,
if(n==SOCKET_ERROR)//网络出现异常
{
break;
}
length-=n;
sendCount+=n;
}
return sendCount; // 返回已发送的字节数
}

int CProxyS::TCPrecv(SOCKET s,char *buf,int len,int flags)
{
int nRev=0,recvCount=0;
int length =len;
if(buf==NULL)
return 0;
// 循环接收数据
while(length>0)
{
nRev =recv(s,buf+recvCount,length,flags);
if(nRev==SOCKET_ERROR)//网络出现异常
{
printf("Failed recv(),error code:%d\n",WSAGetLastError());
break;
}
length-=nRev;
recvCount+=nRev;
}

return recvCount; //返回接收到的字节数
}
...全文
409 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianghandaxue 2014-10-29
  • 打赏
  • 举报
回复
常见的原因是:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉
Yofoo 2014-10-28
  • 打赏
  • 举报
回复
10054 一般是socket被关闭了 看不出什么东西, 具体的去调试
  • 打赏
  • 举报
回复
客户端: #include "StdAfx.h" #include "ProxyC.h" #include <process.h> #include <winsock2.h> #include <afx.h> #pragma comment(lib,"ws2_32.lib") CProxyC* pThis=NULL; CProxyC::CProxyC(void) { WSADATA wasData; WSAStartup(MAKEWORD(2,2),&wasData); this->m_pWndView=NULL; this->socketManager=SOCKET_ERROR; pThis=this; } CProxyC::~CProxyC(void) { WSACleanup(); } VOID CProxyC::OnPostNotif(TCHAR* opNotif) { if(this->m_pWndView!=NULL) { this->m_pWndView->SendMessage(NOTIF_MSG_SHOW,(WPARAM)opNotif); } } BOOL CProxyC::OnStartClientListen(UINT nPort) { HANDLE hServer = (HANDLE)_beginthreadex( NULL, NULL, this->ClientListenProc, (LPVOID)nPort, NULL, NULL ); if(NULL == hServer) { return FALSE; } return TRUE; } unsigned WINAPI CProxyC::ClientListenProc(LPVOID lpVoid) { pThis->socketManager=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(SOCKET_ERROR==pThis->socketManager) { pThis->OnPostNotif(_T("连接失败!")); return 1; } struct sockaddr_in srvaddr; srvaddr.sin_family=AF_INET; srvaddr.sin_port=htons((UINT)lpVoid); srvaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//本地回路地址 int nSrvaddrlen= sizeof(srvaddr); int i=connect(pThis->socketManager,(struct sockaddr*)&srvaddr,nSrvaddrlen); if( i == SOCKET_ERROR) { pThis->OnPostNotif(_T("Client socket connect error!")); closesocket(pThis->socketManager); } pThis->OnPostNotif(_T("Client socket connect OK!")); char bufSend[MAXBUFSIZE]; char bufRecv[MAXBUFSIZE]; int nsendlen; memset(bufSend,0,MAXBUFSIZE); memset(bufRecv,0,MAXBUFSIZE); strcpy_s(bufSend,MAXBUFSIZE,inet_ntoa(srvaddr.sin_addr)); nsendlen=send(pThis->socketManager,bufSend,strlen(bufSend),0); if(0>=nsendlen) { return 1; } //r=recv(ServerProxy,bufRecv,MAXBUFSIZE,0); return 0; }

18,363

社区成员

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

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