请各位帮忙看一下问题。
在写一个程序,需要在后台进行socket连接,可是发现除了在button进程中connect连接成功,在Ontimer或单独thread都失败。
ontimer和AfxBeginThread的实现:
void CTimerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch (nIDEvent)
{
case 1:
int ck = 1;
int result_id;
int i = 1;
m_socket[i] = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
if (INVALID_SOCKET == m_socket[i]) {
ck = 0;
MessageBox("创建套接字失败!");
return;
}
if (SOCKET_ERROR == WSAAsyncSelect(m_socket[i], m_hWnd, UM_SOCK1, FD_READ))
{
ck = 0;
MessageBox("注册网络读取事件失败!");
//return FALSE;
}
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(tcp_local_port);
addrSrv.sin_addr = tcp_local_ip;
tcp_local_port += 1;
bind(m_socket[i], (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
// SOCKADDR_IN addrSrv;
CString remote_ip_str;
CString remote_port_str;
if (remote_ip_str.IsEmpty()) {
addrSrv.sin_addr.S_un.S_addr = inet_addr(ROMOTE_IP_ADDRESS);
}
else {
addrSrv.sin_addr.S_un.S_addr = inet_addr(remote_ip_str);
}
if (remote_port_str.IsEmpty()) {
addrSrv.sin_port = htons(TCP_CLIENT_REMOTE_PORT);
}
else {
u16_t port = _ttoi((const char*)remote_port_str.GetBuffer(remote_port_str.GetLength()));
addrSrv.sin_port = htons(port);
}
addrSrv.sin_family = AF_INET;
remote_ip_str.Format("%s", inet_ntoa(addrSrv.sin_addr));
remote_port_str.Format("%d", htons(addrSrv.sin_port));
result_id = connect(m_socket[i], (struct sockaddr*)&addrSrv, sizeof(struct sockaddr));
if (result_id < 0)
{
ck = 0;
//MessageBox("连接yeelink失败");
return;
}
}
CDialog::OnTimer(nIDEvent);
}
UINT ThreadFunc(LPVOID lpParam)
{
int ck=1;
int result_id;
HWND* m_hWnd = (HWND*)lpParam;
CString remote_ip_address[10];
while (1)
{
for (int i = 1; i <= 9; i++)
{
remote_ip_address[1].Format("192.168.31.29", i);
#if 1
if (m_socket[i] == NULL)
{
m_socket[i] = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
if (INVALID_SOCKET == m_socket[i]) {
ck = 0;
// MessageBox("创建套接字失败!");
return 0;
}
}
if (SOCKET_ERROR == WSAAsyncSelect(m_socket[i], *m_hWnd, UM_SOCK1, FD_READ))
{
ck = 0;
// MessageBox("注册网络读取事件失败!");
if (m_socket[i])
{
shutdown(m_socket[i], SD_BOTH);
closesocket(m_socket[i]);
}
break;
}
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(tcp_local_port);
addrSrv.sin_addr = tcp_local_ip;
tcp_local_port += 1;
bind(m_socket[i], (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
// SOCKADDR_IN addrSrv;
CString remote_ip_str;
CString remote_port_str;
if (remote_ip_str.IsEmpty()) {
addrSrv.sin_addr.S_un.S_addr = inet_addr(remote_ip_address[i]);
// addrSrv.sin_addr.S_un.S_addr = inet_addr(ROMOTE_IP_ADDRESS);
}
else {
addrSrv.sin_addr.S_un.S_addr = inet_addr(remote_ip_str);
}
if (remote_port_str.IsEmpty()) {
addrSrv.sin_port = htons(TCP_CLIENT_REMOTE_PORT);
}
else {
u16_t port = _ttoi((const char*)remote_port_str.GetBuffer(remote_port_str.GetLength()));
addrSrv.sin_port = htons(port);
}
addrSrv.sin_family = AF_INET;
remote_ip_str.Format("%s", inet_ntoa(addrSrv.sin_addr));
remote_port_str.Format("%d", htons(addrSrv.sin_port));
result_id = connect(m_socket[i], (struct sockaddr*)&addrSrv, sizeof(struct sockaddr));
if (result_id < 0)
{
ck = 0;
break;
//MessageBox("连接yeelink失败");
}
cmd_start_flag = 1;
#endif
}
Sleep(1);
}
return 0;
}
void CTimerDlg::OnBUTTONPalayPause()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int i=1;
int ck;
int result_id;
if (!cmd_start_flag)
{
cmd_start_flag = 1;
InitSocket();
// pReadAviThread = AfxBeginThread(ThreadFunc, &m_hWnd);
SetTimer(1, 1000, 0);
#if 0
m_socket[i] = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
if (INVALID_SOCKET == m_socket[i]) {
ck = 0;
MessageBox("创建套接字失败!");
return;
}
if (SOCKET_ERROR == WSAAsyncSelect(m_socket[i], m_hWnd, UM_SOCK1, FD_READ))
{
ck = 0;
MessageBox("注册网络读取事件失败!");
//return FALSE;
}
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(tcp_local_port);
addrSrv.sin_addr = tcp_local_ip;
tcp_local_port += 1;
bind(m_socket[i], (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
// SOCKADDR_IN addrSrv;
CString remote_ip_str;
CString remote_port_str;
if (remote_ip_str.IsEmpty()) {
addrSrv.sin_addr.S_un.S_addr = inet_addr(ROMOTE_IP_ADDRESS);
}
else {
addrSrv.sin_addr.S_un.S_addr = inet_addr(remote_ip_str);
}
if (remote_port_str.IsEmpty()) {
addrSrv.sin_port = htons(TCP_CLIENT_REMOTE_PORT);
}
else {
u16_t port = _ttoi((const char*)remote_port_str.GetBuffer(remote_port_str.GetLength()));
addrSrv.sin_port = htons(port);
}
addrSrv.sin_family = AF_INET;
remote_ip_str.Format("%s", inet_ntoa(addrSrv.sin_addr));
remote_port_str.Format("%d", htons(addrSrv.sin_port));
result_id = connect(m_socket[i], (struct sockaddr*)&addrSrv, sizeof(struct sockaddr));
if (result_id < 0)
{
ck = 0;
//MessageBox("连接yeelink失败");
return;
}
#endif
}
else {
if (pReadAviThread)
WaitForSingleObject(pReadAviThread->m_hThread, INFINITE);
for (int i = 1; i <= 9; i++)
{
if (m_socket[i])
{
shutdown(m_socket[i], SD_BOTH);
closesocket(m_socket[i]);
}
}
cmd_start_flag = 0;
}
}
}