Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: падключицца (winsock) :)  (Прочитано 14076 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 02-04-2005 12:21 » 

пытаюсь пытать сокеты - получилось (вроде) инициализировать только клиента - по крайней мере комп, 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("не удалось слу");
}
}



вот и всё о проблеме... как появлюсь - сразу прочитаю, знаю , поможете Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 09-04-2005 11:08 » 

ладно, тут вопрос снят Улыбаюсь (вроде бы я разобрался)
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 09-04-2005 13:26 » 

А где ошибка-то была?
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 09-04-2005 13:35 » 

Кстати, если что, я могу выслать маленький пректик один клиент и один сервер (в разных приложениях). Писал на АПИ. В этом приложении коннект обычный, соединение с сервером, обмен сообщениями. Малое количество строк делает их понятными, а то я у тебя тут не очень-то понял (в смысле строк много, я сразу теряюсь + это гребанное МФЦ дофига своего добавляет), правда, извени конечно, но особо разобраться и времени нету Жаль хотя уж очень мне хотелось подсказать тебе что не так Ага.
Если что, пиши, я вышлю.
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 10-04-2005 12:31 » 

nikedeforest , присылай обязательно, посмотрю, если будет время Улыбаюсь

а косяк был в разных портах.... неправильно я порт указал
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 13-04-2005 10:45 » 

Пока только сервер, не могу че-то клиент найти, хотя должен быть. Скоро клиент скину.

* TCPServerCopy.rar (30.08 Кб - загружено 912 раз.)
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 18-04-2005 15:12 » 

Извени, что высылаю позже чем обещал, провайдер два дня мозги ##ал с доступом в интернет.
Вот клиент.
Если будешь тестировать на одном компьютере то IP 127.0.0.1 , ну ты и сам знаешь Улыбаюсь

* TCPClientBegin.rar (15.06 Кб - загружено 910 раз.)
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 19-04-2005 13:46 » 

127.0.0.1 - нет, не знаю, почему?
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 19-04-2005 16:56 » 

Не, ну если серьезно не знаешь, то могу пояснить, с опред. долей ошибок в терминологии на своем ламерском уровне.
127.0.0.1 - это IP- адрес локального сервера твоей машины. Он у всех такой. Если будешь тестировать н-р на двух компах в локалке, то в клиенте должен будешь прописать адрес машины на которой стоит сервер. Адрес влокалке не очень помню, помню первые 3 цифры 192. Клиент будет пытаться соединиться сначала с машиной по IP-адресу, этой машине клиент указывает порт, который ему необходим, затем операционка (что именно за это отвечает не знаю) перенаправляет запрос на порт в случае если он открыт (ой, кажется неправильно выразился, ну извени как могу). А порт как раз открывает наш сервер, мы в параметрах структуры типа sockaddr в программе "сервер" указываем какой порт мы открываем. И если порт открыт, то клиент общается с сервером и наоборот.
Стоит отметить, что в программе сервер мы указываем только порт, IP-адрес мы не указываем, т.к. от сервера ничего не зависит.
Ну вроде пришли к феерическому финалу, т.е. мысль такая, что IP-адрес он для ЭВМ. В твоем случае и клиент и сервер на одной машине и ее адрес для всех 127.0.0.1.
Короче как мог объяснил, может многое наврал, сразу предупреждаю, извени если что не так. 
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 24-04-2005 07:12 » 

а я когда создаю сокет - мне он создаётся только с тем IP, который на данном компе...

но - я немного другим чичас занят, как плотнее подберусь, тогда разумные вопросы стану задавать Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 17-04-2006 20:38 » 

(комент)

Поскольку статьи про сокеты были, то если Найковские аттачи никому не нужны - то тему можно убивать
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines