CSCOKET到底连接成功没啊

时间:2022-04-04 10:31:00
服务端与客户端都是用的从CSOCKET(MFC)继承来的的套接字类
服务端:

 if(m_listensock.create(6260))
{
   if(m_listensock.listen(100))  
   {
     //省略
   }
   else
   {
   }
}

客户端:
  if( m_socket.create() )
  {
   //省略
   }
   if (m_socket.connect(ip,6260)) //执行到此处,服务端开始响应,
   {
   }

客户端执行m_socket.connect(ip,port)后,服务端触发了OnAccept(),OnAceept()执行完了
m_socket.connect(ip,port)却没有返回,再关掉客户端程序,服务端的OnClose()也能被触发,高手给看下,到底怎么回事,说连接成功,m_socket.connect(ip,6260)没返回,说不成功,关掉客户端还能触发OnClose()?

13 个解决方案

#1


connect没有返回? 阻塞了?

#2


引用 1 楼 oyljerry 的回复:
connect没有返回? 阻塞了?


 if (m_socket.connect(ip,6260)) 这行设置断点

按F10运行的话,会从VS2005代码页面跳到程序主界面...

#3


然后服务端Accept之后,继续客户端F10没反应吗

#4


应该是你的OnAccept里面没accept吧...

#5


断点调试是正途

#6


我有在onaccept()中调用accept(),而且返回真,问题是服务器端相应之后客户端connect()一直不返回。关掉客户端,服务端能响应onclose()

#7


引用 2 楼 JoeyPLee 的回复:
Quote: 引用 1 楼 oyljerry 的回复:

connect没有返回? 阻塞了?


 if (m_socket.connect(ip,6260)) 这行设置断点

按F10运行的话,会从VS2005代码页面跳到程序主界面...

那就是没有阻塞啊,Connect成功了啊~

#8


建议楼主自己封装不要使用MFC,虽然效率上有所提高但是很大程度上掩盖很多知识。
现附上我自己改写的SOCKET代码 此代码利用SMTP协议实现邮件发送。
此代码仅供参考不完整!

    WSADATA WSAData;  
    WSAStartup(MAKEWORD(2, 2), &WSAData);  
    #endif   
    memset(&their_addr, 0, sizeof(their_addr));  
    their_addr.sin_family = AF_INET;  
    their_addr.sin_port = htons(25);  
hostent* hptr         = gethostbyname("smtp.qq.com"); 
    memcpy(&their_addr.sin_addr.s_addr, hptr->h_addr_list[0], hptr->h_length); 
    sockfd = open_socket((struct sockaddr *)&their_addr); 
 


#9


Quote: 引用 8 楼 chaojizhiduoxing 的回复:

建议楼主自己封装不要使用MFC,虽然效率上有所提高但是很大程度上掩盖很多知识。
现附上我自己改写的SOCKET代码 此代码利用SMTP协议实现邮件发送。
此代码仅供参考不完整!

    WSADATA WSAData;  
    WSAStartup(MAKEWORD(2, 2), &WSAData);  
    #endif   
    memset(&their_addr, 0, sizeof(their_addr));  
    their_addr.sin_family = AF_INET;  
    their_addr.sin_port = htons(25);  
hostent* hptr         = gethostbyname("smtp.qq.com"); 
    memcpy(&their_addr.sin_addr.s_addr, hptr->h_addr_list[0], hptr->h_length); 
    sockfd = open_socket((struct sockaddr *)&their_addr); 
 


int open_socket(struct sockaddr *addr)  
{  
        int sockfd = 0;  
        sockfd=socket(PF_INET, SOCK_STREAM, 0);  
        if(sockfd < 0)  
        {  
            fprintf(stderr, "Open sockfd(TCP) error!\n");  
            exit(-1);  
        }  
        if(connect(sockfd, addr, sizeof(struct sockaddr)) < 0)  
        {  
            DWORD num;
num=GetLastError();
fprintf(stderr, "Connect sockfd(TCP) error!\n");   
            exit(-1);  
        }  
        return sockfd;  
}  

#10


引用 9 楼 chaojizhiduoxing 的回复:
Quote: 引用 8 楼 chaojizhiduoxing 的回复:

建议楼主自己封装不要使用MFC,虽然效率上有所提高但是很大程度上掩盖很多知识。
现附上我自己改写的SOCKET代码 此代码利用SMTP协议实现邮件发送。
此代码仅供参考不完整!

    WSADATA WSAData;  
    WSAStartup(MAKEWORD(2, 2), &WSAData);  
    #endif   
    memset(&their_addr, 0, sizeof(their_addr));  
    their_addr.sin_family = AF_INET;  
    their_addr.sin_port = htons(25);  
hostent* hptr         = gethostbyname("smtp.qq.com"); 
    memcpy(&their_addr.sin_addr.s_addr, hptr->h_addr_list[0], hptr->h_length); 
    sockfd = open_socket((struct sockaddr *)&their_addr); 
 


int open_socket(struct sockaddr *addr)  
{  
        int sockfd = 0;  
        sockfd=socket(PF_INET, SOCK_STREAM, 0);  
        if(sockfd < 0)  
        {  
            fprintf(stderr, "Open sockfd(TCP) error!\n");  
            exit(-1);  
        }  
        if(connect(sockfd, addr, sizeof(struct sockaddr)) < 0)  
        {  
            DWORD num;
num=GetLastError();
fprintf(stderr, "Connect sockfd(TCP) error!\n");   
            exit(-1);  
        }  
        return sockfd;  
}  



可能以后会自己封装API,眼下还是要先解决问题先,哎,没想到一个简单的CSOCKET也我都搞不定

#11


引用 7 楼 VisualEleven 的回复:
Quote: 引用 2 楼 JoeyPLee 的回复:

Quote: 引用 1 楼 oyljerry 的回复:

connect没有返回? 阻塞了?


 if (m_socket.connect(ip,6260)) 这行设置断点

按F10运行的话,会从VS2005代码页面跳到程序主界面...

那就是没有阻塞啊,Connect成功了啊~


if( m_socket.connect(ip,6260) // break point 1
{
   // break point 2
}
else
{
   //break point 3
}
关键是怎么单步,只能运行到break point 1 
break point 2 和 break point 3 的代码执行不了
服务端OnAccept()能相映,accept(*pSocket)也返回TRUE

#12


你连接成功后服务端给客户端发个消息,看客户端有没有响应

#13


今天查看了端口信息,在执行 m_socket.connect(ip,6260)时候,端口变成了,established状态,这个状态不是连接成功么?
但是 m_socket.connect(ip,6260)阻塞不返回,一直到关掉客户端,m_socket.connect(ip,6260)才会返回连接失败,我想问,csocket的connect()不是异步的马,咋会阻塞
另外,我的服务端和客户端在一台电脑上进行

#1


connect没有返回? 阻塞了?

#2


引用 1 楼 oyljerry 的回复:
connect没有返回? 阻塞了?


 if (m_socket.connect(ip,6260)) 这行设置断点

按F10运行的话,会从VS2005代码页面跳到程序主界面...

#3


然后服务端Accept之后,继续客户端F10没反应吗

#4


应该是你的OnAccept里面没accept吧...

#5


断点调试是正途

#6


我有在onaccept()中调用accept(),而且返回真,问题是服务器端相应之后客户端connect()一直不返回。关掉客户端,服务端能响应onclose()

#7


引用 2 楼 JoeyPLee 的回复:
Quote: 引用 1 楼 oyljerry 的回复:

connect没有返回? 阻塞了?


 if (m_socket.connect(ip,6260)) 这行设置断点

按F10运行的话,会从VS2005代码页面跳到程序主界面...

那就是没有阻塞啊,Connect成功了啊~

#8


建议楼主自己封装不要使用MFC,虽然效率上有所提高但是很大程度上掩盖很多知识。
现附上我自己改写的SOCKET代码 此代码利用SMTP协议实现邮件发送。
此代码仅供参考不完整!

    WSADATA WSAData;  
    WSAStartup(MAKEWORD(2, 2), &WSAData);  
    #endif   
    memset(&their_addr, 0, sizeof(their_addr));  
    their_addr.sin_family = AF_INET;  
    their_addr.sin_port = htons(25);  
hostent* hptr         = gethostbyname("smtp.qq.com"); 
    memcpy(&their_addr.sin_addr.s_addr, hptr->h_addr_list[0], hptr->h_length); 
    sockfd = open_socket((struct sockaddr *)&their_addr); 
 


#9


Quote: 引用 8 楼 chaojizhiduoxing 的回复:

建议楼主自己封装不要使用MFC,虽然效率上有所提高但是很大程度上掩盖很多知识。
现附上我自己改写的SOCKET代码 此代码利用SMTP协议实现邮件发送。
此代码仅供参考不完整!

    WSADATA WSAData;  
    WSAStartup(MAKEWORD(2, 2), &WSAData);  
    #endif   
    memset(&their_addr, 0, sizeof(their_addr));  
    their_addr.sin_family = AF_INET;  
    their_addr.sin_port = htons(25);  
hostent* hptr         = gethostbyname("smtp.qq.com"); 
    memcpy(&their_addr.sin_addr.s_addr, hptr->h_addr_list[0], hptr->h_length); 
    sockfd = open_socket((struct sockaddr *)&their_addr); 
 


int open_socket(struct sockaddr *addr)  
{  
        int sockfd = 0;  
        sockfd=socket(PF_INET, SOCK_STREAM, 0);  
        if(sockfd < 0)  
        {  
            fprintf(stderr, "Open sockfd(TCP) error!\n");  
            exit(-1);  
        }  
        if(connect(sockfd, addr, sizeof(struct sockaddr)) < 0)  
        {  
            DWORD num;
num=GetLastError();
fprintf(stderr, "Connect sockfd(TCP) error!\n");   
            exit(-1);  
        }  
        return sockfd;  
}  

#10


引用 9 楼 chaojizhiduoxing 的回复:
Quote: 引用 8 楼 chaojizhiduoxing 的回复:

建议楼主自己封装不要使用MFC,虽然效率上有所提高但是很大程度上掩盖很多知识。
现附上我自己改写的SOCKET代码 此代码利用SMTP协议实现邮件发送。
此代码仅供参考不完整!

    WSADATA WSAData;  
    WSAStartup(MAKEWORD(2, 2), &WSAData);  
    #endif   
    memset(&their_addr, 0, sizeof(their_addr));  
    their_addr.sin_family = AF_INET;  
    their_addr.sin_port = htons(25);  
hostent* hptr         = gethostbyname("smtp.qq.com"); 
    memcpy(&their_addr.sin_addr.s_addr, hptr->h_addr_list[0], hptr->h_length); 
    sockfd = open_socket((struct sockaddr *)&their_addr); 
 


int open_socket(struct sockaddr *addr)  
{  
        int sockfd = 0;  
        sockfd=socket(PF_INET, SOCK_STREAM, 0);  
        if(sockfd < 0)  
        {  
            fprintf(stderr, "Open sockfd(TCP) error!\n");  
            exit(-1);  
        }  
        if(connect(sockfd, addr, sizeof(struct sockaddr)) < 0)  
        {  
            DWORD num;
num=GetLastError();
fprintf(stderr, "Connect sockfd(TCP) error!\n");   
            exit(-1);  
        }  
        return sockfd;  
}  



可能以后会自己封装API,眼下还是要先解决问题先,哎,没想到一个简单的CSOCKET也我都搞不定

#11


引用 7 楼 VisualEleven 的回复:
Quote: 引用 2 楼 JoeyPLee 的回复:

Quote: 引用 1 楼 oyljerry 的回复:

connect没有返回? 阻塞了?


 if (m_socket.connect(ip,6260)) 这行设置断点

按F10运行的话,会从VS2005代码页面跳到程序主界面...

那就是没有阻塞啊,Connect成功了啊~


if( m_socket.connect(ip,6260) // break point 1
{
   // break point 2
}
else
{
   //break point 3
}
关键是怎么单步,只能运行到break point 1 
break point 2 和 break point 3 的代码执行不了
服务端OnAccept()能相映,accept(*pSocket)也返回TRUE

#12


你连接成功后服务端给客户端发个消息,看客户端有没有响应

#13


今天查看了端口信息,在执行 m_socket.connect(ip,6260)时候,端口变成了,established状态,这个状态不是连接成功么?
但是 m_socket.connect(ip,6260)阻塞不返回,一直到关掉客户端,m_socket.connect(ip,6260)才会返回连接失败,我想问,csocket的connect()不是异步的马,咋会阻塞
另外,我的服务端和客户端在一台电脑上进行