пытаюсь пытать сокеты - получилось (вроде) инициализировать только клиента - по крайней мере комп, IP которого я запрашиваю в качестве сервера, показывает передачу/приём данных (пока - фиг знает каких)
когда же создаю сервер , то он ведь блин и создаётся , и , собака, инициализируется , и слушает ( Listen(2)==0 ) . А поскольку слышит (а как ещё понимать вернутый ноль?!!! ) я делаю accept() - и всё, блокируется, как буд-то никто к нему не обращается. На сообщения прога отвечает - в частности окно двигается и сворачивается (на закрытие вежливое XP предлагает убить процесс - он типа нЕОтвечает
)) ).
пробую так : запускаю прогу (кстати - рабочий... хм... класс CConnect::CGuard2Socket приведён ниже , а также и код инициализации сокетов в диалоге CConnect) на двух компах, на одном - в режиме клиента, на другом - в режиме сервера. Затем перевожу сервер в режим ожидания (синхронно, насколько я понимаю), а с другого компа пытаюсь клиентом достучаться до. Клиент некоторое время думает и - обламывает
класс этот я писал, поэтому - если увиите какие косяки, тоже , пожалуйста, укажите
(извиняюсь за отсутствие комментов, но вроде и без них понятно)
BOOL CConnectApp::InitInstance()
{
if (!AfxSocketInit())
{
AfxMessageBox("Не удалось инициализировать сокеты. Выход.");
return FALSE;
}
...
...
CConnectDlg dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
return FALSE;
}
заголовок диалога
class CConnectDlg : public CDialog
{
private:
class CGuardSocket
{
public:
enum
{
//значения для инициализации и дефолтов
i_wVersion=0x0202,
i_nSocktype=SOCK_STREAM,
i_wPort_Cl=3181,
i_dwdIP_Cl=(((DWORD)169)<<24)|(((DWORD)254)<<16)|(((DWORD)26)<<8)|((DWORD)197),
i_wPort_Sr=3182,
i_dwdIP_Sr=(((DWORD)169)<<24)|(((DWORD)254)<<16)|(((DWORD)26)<<8)|((DWORD)197)
};
public:
~CGuardSocket()
{
Close();
}
void Close()
{
if(to_hsock)closesocket(to_hsock);
if(hsock)closesocket(hsock);
bInited=false;
bCreated=false;
}
bool bServer;
bool bInited;
bool bCreated;
WSADATA wsadata;
SOCKET hsock;
int nSocktype;
WORD wVersion;
sockaddr_in SockAddrIn;
WORD wPort;
DWORD dwdIP;
SOCKET to_hsock;
sockaddr_in to_SockAddrIn;
int to_nSockAddrInLen;
CGuardSocket(){Clear();}
void Clear()
{
bServer=false;
bInited=false;
bCreated=false;
nSocktype=i_nSocktype;
wVersion=i_wVersion;
hsock=INVALID_SOCKET;
wPort=0;
dwdIP=0;
to_hsock=INVALID_SOCKET;
to_nSockAddrInLen=0;
}
bool InitSocket(int* pnErr=0)
{
if(bInited)return false;
if(0==WSAStartup(wVersion,&wsadata))
{
bInited=true;
}
else
{
bInited=false;
if(pnErr)(*pnErr)=WSAGetLastError();
}
return bInited;
}
bool Create(bool bserv,WORD port=0,DWORD ip=0,int* pnErr=0)
{
bServer=bserv;
wPort=(port?port:(bServer?i_wPort_Sr:i_wPort_Cl));
dwdIP=(ip?ip:(bServer?i_dwdIP_Sr:i_dwdIP_Cl));
if(bCreated || !bInited)return false;
hsock=socket(AF_INET,nSocktype,0);
if(hsock==INVALID_SOCKET)
{
bCreated=false;
if(pnErr)(*pnErr)=WSAGetLastError();
}
else
{
SockAddrIn.sin_family=AF_INET;
SockAddrIn.sin_port=htons(wPort);
SockAddrIn.sin_addr.s_addr=htonl(dwdIP);
if(0==bind(hsock,(sockaddr*)&SockAddrIn,sizeof(SockAddrIn)))
{
bCreated=true;
}
else
{
bCreated=false;
if(pnErr)(*pnErr)=WSAGetLastError();
}
}
if(!bCreated)bInited=false;
return bCreated;
}
bool Listen(int backlog=1,int* pnErr=0)
{
if(!bCreated || !bInited || !bServer)return false;
bool res=false;
if(0==listen(hsock,backlog))
{
res=true;
}
else
{
if(pnErr)(*pnErr)=WSAGetLastError();
}
return res;
}
bool Accept(int* pnErr=0)
{
if(!bCreated || !bInited || !bServer)return false;
bool res=false;
to_nSockAddrInLen=sizeof(to_SockAddrIn);
to_hsock=accept(hsock,(sockaddr*)&to_SockAddrIn,&to_nSockAddrInLen);
if(to_hsock==INVALID_SOCKET)
{
res=false;
if(pnErr)(*pnErr)=WSAGetLastError();
}
else
{
res=true;
}
return res;
}
//IP="4.3.2.1"
bool Connect(WORD port,CString csIP,int* pnErr=0)
{
to_SockAddrIn.sin_addr.s_addr=inet_addr(csIP);
return Connect(port,pnErr);
}
//IP=0x04030201
bool Connect(WORD port,DWORD dwdIP,int* pnErr=0)
{
to_SockAddrIn.sin_addr.s_addr=htonl(dwdIP);
return Connect(port,pnErr);
}
private:
bool Connect(WORD port,int* pnErr)
{
if(!bCreated || !bInited || bServer)return false;
to_SockAddrIn.sin_family=AF_INET;
to_SockAddrIn.sin_port=htons(wPort);
bool res=false;
to_nSockAddrInLen=sizeof(to_SockAddrIn);
to_hsock=connect(hsock,(sockaddr*)&to_SockAddrIn,to_nSockAddrInLen);
if(to_hsock==INVALID_SOCKET)
{
res=false;
if(pnErr)(*pnErr)=WSAGetLastError();
}
else
{
res=true;
}
return res;
}
public:
};
CGuardSocket m_ClientSock;
CGuardSocket m_ServerSock;
public:
CConnectDlg(CWnd* pParent = NULL);
//{{AFX_DATA(CConnectDlg)
enum { IDD = IDD_CONNECT_DIALOG };
//}}AFX_DATA
//{{AFX_VIRTUAL(CConnectDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);
//}}AFX_VIRTUAL
protected:
HICON m_hIcon;
//{{AFX_MSG(CConnectDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
virtual void OnOK();
virtual void OnCancel();
afx_msg void OnClose();
afx_msg void OnbnSERVER();
afx_msg void OnbnCLIENT();
afx_msg void OnbnCONNECT();
afx_msg void OnbnCLOSESERVER();
afx_msg void OnbnCLOSECLIENT();
afx_msg void OnbnLISTEN();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
реализация диалога
(собсна обработчики кнопок на диалоге...)
//создание сервера
void CConnectDlg::OnbnSERVER()
{
if(m_ServerSock.InitSocket())
{
if(m_ServerSock.Create(true))
{
GetDlgItem(IDC_stCLIENT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCLIENT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCLOSECLIENT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCONNECT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_stSERVER)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_bnSERVER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnLISTEN)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_bnCLOSESERVER)->ShowWindow(SW_SHOW);
}
else
{
AfxMessageBox("сервер не создан");
}
}
}
void CConnectDlg::OnbnCLIENT()
{
if(m_ClientSock.InitSocket())
{
if(m_ClientSock.Create(false))
{
GetDlgItem(IDC_stSERVER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnSERVER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnLISTEN)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCLOSESERVER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_stCLIENT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_bnCLIENT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCLOSECLIENT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_bnCONNECT)->ShowWindow(SW_SHOW);
}
else
{
AfxMessageBox("клиент не создан");
}
}
}
void CConnectDlg::OnbnCLOSESERVER()
{
m_ServerSock.Close();
GetDlgItem(IDC_stCLIENT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCLIENT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_bnCLOSECLIENT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCONNECT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_stSERVER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnSERVER)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_bnLISTEN)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCLOSESERVER)->ShowWindow(SW_HIDE);
}
void CConnectDlg::OnbnCLOSECLIENT()
{
m_ClientSock.Close();
GetDlgItem(IDC_stCLIENT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCLIENT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_bnCLOSECLIENT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCONNECT)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_stSERVER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnSERVER)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_bnLISTEN)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_bnCLOSESERVER)->ShowWindow(SW_HIDE);
}
void CConnectDlg::OnbnCONNECT()
{
if(m_ClientSock.Connect(3182,"169.254.22.176")) //IP компа с клиентом
{
AfxMessageBox("найден сервер");
}
else
{
AfxMessageBox("не найден сервер");
}
}
void CConnectDlg::OnbnLISTEN()
{
if(m_ServerSock.Listen(1))
{
if(m_ServerSock.Accept())
{
AfxMessageBox("найден клиент");
}
else
{
AfxMessageBox("не найден клиент");
}
}
else
{
AfxMessageBox("не удалось слу");
}
}
вот и всё о проблеме... как появлюсь - сразу прочитаю, знаю , поможете