代理服务器代理端向服务端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; //返回接收到的字节数
}
...全文
362 3 打赏 收藏 转发到动态 举报
写回复
用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; }
ICE-3.7.4 最新安装文件msi文件,windows版 ICE常见报错 Exception in thread Ice.ConnectionRefusedException error = 0 at IceInternal.Network.doFinishConnect(Network.java:417) at IceInternal.TcpTransceiver.initialize(TcpTransceiver.java:33) at Ice.ConnectionI.initialize(ConnectionI.java:1536) at Ice.ConnectionI.socketReady(ConnectionI.java:1116) at Ice.ConnectionI$SocketReadyCallback.socketReady(ConnectionI.java:2299) at IceInternal.SelectorThread.run(SelectorThread.java:203) at IceInternal.SelectorThread$HelperThread.run(SelectorThread.java:273) Caused by: java.net.ConnectException: Connection refused at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:574) at IceInternal.Network.doFinishConnect(Network.java:393) ... 6 more 这种报错是ICE服务没有起来,telnet服务ICE的口不通,无法建立socke 原帖地址:http://blog.csdn.net/zhenjing/archive/2009/09/10/4538705.aspx ICE常见编译和运行(异常)错误 收藏 在编译和Ice应用相关的文件中,经常因为ice相关的文件包含关系而导致编译无法通过,此时的错误一般提示和handle.h相关。然而想要解决这样的错误,一般只需要把在无法编译成.o文件的.cpp文件中和ice文件相关的头文件放在该.cpp文件的起始行即可。也就是说,根据提示,把.cpp文件中最早提示导致出错的.h文件放在起始行。 ICE的常见运行错误(异常): 1 使用的地址错误,IP并非本地IP: 发生在初始化服务器时,没办法初始化adapter. 错误信息: (IP错误) ./test: Network.cpp:475: Ice::SocketException: socket exception: Cannot assign requestedaddress 另外: 已经启动服务器后又重新启动: 发生在初始化服务器时,没办法初始化adapter. 错误信息: (port已经被使用) ./server: Network.cpp:475:Ice::SocketException: socket exception: Address already in use ///stringtoProxy对于任何string都是有效的,均可以生成相应代理,但是该代理是否有效是无法保证的. 如果代理无效,也就是说根本就没有这样的adapter或者对象,那么使用Checkcast或直接用该代理调用相应对象接口均会抛异常. 下面对每种情况加于分析. 2 使用的代理IP错误: 发生在使用代理调用接口的时候 原因: 根本就没有相应的通讯器存在. 错误信息: (使用的代理IP错误) 抛出异常: Ice::ConnectFailedException(需要几秒, 需要进行搜索) 3 使用的代理错误,两边不一致 : 发生在使用代理调用接口的时候 原因: 存在通讯器,但是不存在相应的对象适配器. 错误信息: 抛出异常: Ice::ConnectionRefusedException(很快, 口没有被启用引起的,无人监听该口) 4 使用的对象名字不正确: 发生在使用代理调用接口的时候 原因: 能够找到相应的对象适配器,但是该对象适配器中无法找到相应的对象 错误信息: 抛出异常: Ice::ObjectNotExistException(很

18,356

社区成员

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

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