服务端:
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
if (m_socket.connect(ip,6260)) 这行设置断点
按F10运行的话,会从VS2005代码页面跳到程序主界面...
#3
然后服务端Accept之后,继续客户端F10没反应吗
#4
应该是你的OnAccept里面没accept吧...
#5
断点调试是正途
#6
我有在onaccept()中调用accept(),而且返回真,问题是服务器端相应之后客户端connect()一直不返回。关掉客户端,服务端能响应onclose()
#7
那就是没有阻塞啊,Connect成功了啊~
#8
建议楼主自己封装不要使用MFC,虽然效率上有所提高但是很大程度上掩盖很多知识。
现附上我自己改写的SOCKET代码 此代码利用SMTP协议实现邮件发送。
此代码仅供参考不完整!
现附上我自己改写的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
建议楼主自己封装不要使用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
建议楼主自己封装不要使用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
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()不是异步的马,咋会阻塞
另外,我的服务端和客户端在一台电脑上进行
但是 m_socket.connect(ip,6260)阻塞不返回,一直到关掉客户端,m_socket.connect(ip,6260)才会返回连接失败,我想问,csocket的connect()不是异步的马,咋会阻塞
另外,我的服务端和客户端在一台电脑上进行
#1
connect没有返回? 阻塞了?
#2
connect没有返回? 阻塞了?
if (m_socket.connect(ip,6260)) 这行设置断点
按F10运行的话,会从VS2005代码页面跳到程序主界面...
#3
然后服务端Accept之后,继续客户端F10没反应吗
#4
应该是你的OnAccept里面没accept吧...
#5
断点调试是正途
#6
我有在onaccept()中调用accept(),而且返回真,问题是服务器端相应之后客户端connect()一直不返回。关掉客户端,服务端能响应onclose()
#7
connect没有返回? 阻塞了?
if (m_socket.connect(ip,6260)) 这行设置断点
按F10运行的话,会从VS2005代码页面跳到程序主界面...
那就是没有阻塞啊,Connect成功了啊~
#8
建议楼主自己封装不要使用MFC,虽然效率上有所提高但是很大程度上掩盖很多知识。
现附上我自己改写的SOCKET代码 此代码利用SMTP协议实现邮件发送。
此代码仅供参考不完整!
现附上我自己改写的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
建议楼主自己封装不要使用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
建议楼主自己封装不要使用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
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()不是异步的马,咋会阻塞
另外,我的服务端和客户端在一台电脑上进行
但是 m_socket.connect(ip,6260)阻塞不返回,一直到关掉客户端,m_socket.connect(ip,6260)才会返回连接失败,我想问,csocket的connect()不是异步的马,咋会阻塞
另外,我的服务端和客户端在一台电脑上进行