connect 10061是怎么回事?

时间:2021-05-26 19:49:47
我想实现这样的功能:机器A以TCP方式发送文件给B,B每接到一帧数据就马上转发给C,所以我首先写了一个发送文件的客户端程序client,然后在服务器程序中创建了2个套接字,m_hSocket用于接收,m_hSocket2用于发送,以下是部分程序段
CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CServerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CServerDlg)
m_iPort = 4000;
m_oPort = 5000;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_hSocket=0;
m_hSocket2=NULL;

pBuffer=NULL;
m_strFilePath="";
m_iSize=0;
    bAppend=true;

}





void CServerDlg::InitSock()//
{
    
if(m_hSocket)//如果已经创建,先关闭
{
closesocket(m_hSocket);
                  m_hSocket=NULL;
}
else
{
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
ASSERT(m_hSocket!=NULL);//
}

         CString strError;
m_hSocket;
sockaddr_in addr;
addr.sin_family=AF_INET;//表示在INT上通信
addr.sin_addr.S_un.S_addr=INADDR_ANY;
addr.sin_port=htons(m_iPort); 
int ret=0;
int error=0;
ret=bind(m_hSocket,(LPSOCKADDR)&addr,sizeof(addr));//
if(ret==SOCKET_ERROR)
{
strError.Format("Bind Error:%d ",error=WSAGetLastError());
AfxMessageBox(strError);
closesocket(m_hSocket);
return;
}
ret=listen(m_hSocket,10);//
if(ret==SOCKET_ERROR)
{
strError.Format("Listen Error:%d ",error=WSAGetLastError());
AfxMessageBox(strError);
closesocket(pDlg->m_hSocket);
return ;
}
else
{
m_cState.SetWindowText("服务端等待连接中...");
}
         AfxBeginThread(ListenThread,this);
          
if(m_hSocket2)//如果已经创建,先关闭
{
closesocket(m_hSocket2);
                  m_hSocket2=NULL;
}
else
{
m_hSocket2=socket(AF_INET,SOCK_STREAM,0);
ASSERT(m_hSocket2!=NULL);//
}

         m_hSocket2;
CString strIP;
pDlg->m_cSvrIP.GetWindowText(strIP);
sockaddr_in addr2;
addr2.sin_family=AF_INET;//表示在INT上通信
addr2.sin_addr.S_un.S_addr=inet_addr(strIP.GetBuffer(0));
addr2.sin_port=htons(m_oPort);
ret=connect(m_hSocket2,(LPSOCKADDR)&addr2,sizeof(addr2));//主动连接服务器
if(ret==SOCKET_ERROR)
{
strError.Format("Connect Error:%d ",error=WSAGetLastError());
AfxMessageBox(strError);
closesocket(m_hSocket2);
}
但是每当执行到ret=connect(m_hSocket2,(LPSOCKADDR)&addr2,sizeof(addr2))的时候都会出现连接错误10061,第2个连接无法实现,我发送——接收——发送现在都是在一台机器上测试,合这个有关系么?



}

8 个解决方案

#1


if(m_hSocket2)//如果已经创建,先关闭 

closesocket(m_hSocket2); 
                  m_hSocket2=NULL; 

else 

m_hSocket2=socket(AF_INET,SOCK_STREAM,0); 
ASSERT(m_hSocket2!=NULL);// 


你自己看下逻辑,假如已经创建了会怎么样.

10061 一般是参数设定错误.或者说目标根本没有提供该服务.
使用telnet 目标IP 目标端口 看看能不能连上. 连不上就说明你前面那个listen是无效的.

#2


监听4000端口
再连接5000端口,5000端口有监听么

#3


CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/) 
: CDialog(CServerDlg::IDD, pParent) 

    m_iPort = 4000; 
    m_oPort = 5000; 
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
    m_hSocket=0; 
    m_hSocket2=0; 

    pBuffer=NULL; 
    m_strFilePath=""; 
    m_iSize=0; 
    bAppend=true; 




因为之前在创建对话框的时候已经把m_hSocket2初始化为NULL了,所以程序应该直接执行
m_hSocket2=socket(AF_INET,SOCK_STREAM,0),还有我是在windows中执行程序,telnet能用么?因为是在同一个机子上测试,m_hSocket 和m_hSocket2都用的是相同的IP,只是端口不同,m_hSocket从创建到 listen都是正确的,为什么m_hSocket2就无法连接了啊?

#4


这得开个线程吧
要不然怎么连?

#5


的确是没有监听5000端口,我改改看

#6


端口没弄好

#7


引用 3 楼 zhangweijlc 的回复:
CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CServerDlg::IDD, pParent)
{
    m_iPort = 4000;
    m_oPort = 5000;
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_hSocket=0;
    m_hSocket2=0;

    pBuffer=NULL;
    m_strFilePath="";
    m_iSize=0;
    bAppend=true;

}


因为之前在创建对话框的时候已经把m_hSocket2初始化为NULL了,所以程序应该直接执行
m_hSocket2=socket(AF_INET,SOCK_STREAM,0),还有我是在windows中执行程序,telnet能用么?因为是在同一个机子上测试,m_hSocket 和m_hSocket2都用的是相同的IP,只是端口不同,m_hSocket从创建到 listen都是正确的,为什么m_hSocket2就无法连接了啊?


可以的.

#8


ff

#1


if(m_hSocket2)//如果已经创建,先关闭 

closesocket(m_hSocket2); 
                  m_hSocket2=NULL; 

else 

m_hSocket2=socket(AF_INET,SOCK_STREAM,0); 
ASSERT(m_hSocket2!=NULL);// 


你自己看下逻辑,假如已经创建了会怎么样.

10061 一般是参数设定错误.或者说目标根本没有提供该服务.
使用telnet 目标IP 目标端口 看看能不能连上. 连不上就说明你前面那个listen是无效的.

#2


监听4000端口
再连接5000端口,5000端口有监听么

#3


CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/) 
: CDialog(CServerDlg::IDD, pParent) 

    m_iPort = 4000; 
    m_oPort = 5000; 
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
    m_hSocket=0; 
    m_hSocket2=0; 

    pBuffer=NULL; 
    m_strFilePath=""; 
    m_iSize=0; 
    bAppend=true; 




因为之前在创建对话框的时候已经把m_hSocket2初始化为NULL了,所以程序应该直接执行
m_hSocket2=socket(AF_INET,SOCK_STREAM,0),还有我是在windows中执行程序,telnet能用么?因为是在同一个机子上测试,m_hSocket 和m_hSocket2都用的是相同的IP,只是端口不同,m_hSocket从创建到 listen都是正确的,为什么m_hSocket2就无法连接了啊?

#4


这得开个线程吧
要不然怎么连?

#5


的确是没有监听5000端口,我改改看

#6


端口没弄好

#7


引用 3 楼 zhangweijlc 的回复:
CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CServerDlg::IDD, pParent)
{
    m_iPort = 4000;
    m_oPort = 5000;
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_hSocket=0;
    m_hSocket2=0;

    pBuffer=NULL;
    m_strFilePath="";
    m_iSize=0;
    bAppend=true;

}


因为之前在创建对话框的时候已经把m_hSocket2初始化为NULL了,所以程序应该直接执行
m_hSocket2=socket(AF_INET,SOCK_STREAM,0),还有我是在windows中执行程序,telnet能用么?因为是在同一个机子上测试,m_hSocket 和m_hSocket2都用的是相同的IP,只是端口不同,m_hSocket从创建到 listen都是正确的,为什么m_hSocket2就无法连接了啊?


可以的.

#8


ff