Автор
|
Тема: Как закконектить клиент с сервером, если они на одном компе?
|
bobo |
опубликован 18-08-2001 12:25 MSK
Запускаю сначала сервер, всё ОК - ф-ия accept() выполняется и переводит систему в режим ожидания запросов... Затем запускаю клиент, но на ф-ии connect() облом!(ошибочный код возврата). При отладке обнаружил, что сервер и клиент создают сокеты с одним дескриптором. Может в этом причина? s=socket(AF_INET,SOCK_STREAM,0).
|
purpe
|
опубликован 18-08-2001 12:34 MSK
а по какому адресу коннектится функция connect ?
|
bobo
|
опубликован 18-08-2001 12:46 MSK
вот участок кода: i=socket(AF_INET,SOCK_STREAM,0); memset((char*)&addr,'\0',sizeof(addr)); addr.sin_family=AF_INET; addr.sin_port=htons(81); addr.sin_addr.s_addr=INADDR_ANY; bind(i,(struct sockaddr*)&addr,sizeof(addr)); gethostname(stroka,sizeof(stroka)); hp=gethostbyname(stroka); server_addr.sin_family=AF_INET; memset((char*)&server_addr.sin_addr,hp- >h_addr_list,hp->h_length); server_addr.sin_port=htons(80); if(connect(i,(struct sockaddr*)&server_addr,sizeof(server_addr))==SOCKET_ERROR)MessageBox(NULL,"Error in connect","Error",MB_OK);
|
Emerald
|
опубликован 18-08-2001 14:09 MSK
ДЛя сервера: после подключения клиента необходимо закрыть возможность подключений других клиентов функцией CLOSE. ТОгда всё работает. |
bobo
|
опубликован 18-08-2001 14:56 MSK
так в том то и дело, что клиент не подключается. На сервере после accept() ни одна ф-ия не выполняется. Кроме того, и сервер и клиент имеют одинаковые дескрипторы сокетов - может в этом причина? Тогда как сделать, чтобы эти дескрипторы не совпадали? |
m_fox
|
опубликован 18-08-2001 17:57 MSK
Пример. Клиент посылает данные, а сервер их отображает. У клиента в командной строке укажи IP.#include "stdafx.h" #include <winsock2.h> #include <conio.h> int InitSockets() { WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD( 2, 0 ); if ( WSAStartup( wVersionRequested, &wsaData ) != 0 ) { /* Tell the user that we couldn't find a usable */ /* WinSock DLL. */ return WSAGetLastError(); } /* Confirm that the WinSock DLL supports 2.0.*/ /* Note that if the DLL supports versions greater */ /* than 2.0 in addition to 2.0, it will still return */ /* 2.0 in wVersion since that is the version we */ /* requested. */ if ( LOBYTE( wsaData.wVersion ) != 2 |
m_fox
|
опубликован 18-08-2001 18:00 MSK
Опа, обрезался. Если нужно, то мылом. |
bobo
|
опубликован 18-08-2001 18:36 MSK
Да, лучше мылом. Заранее благодарен. |
vitalic
|
опубликован 18-08-2001 20:33 MSK
A cacoi cod oshibki vidaiot client? |
bobo
|
опубликован 18-08-2001 20:58 MSK
что самое интересное, и WSAGetLastError() ни GetLastError() возвращают ноль! Как ещё можно протестировать код ошибки? |
vitalic
|
опубликован 19-08-2001 01:17 MSK
Podji ti je v samom naciale scazal shto u tebia (ощибочный код возврата)? |
vitalic
|
опубликован 19-08-2001 01:23 MSK
Raz proizoshla oshibca WSAGetLastError() doljna bila vidati tebe nomer oshibki. A vobshe prishli mne ishaodniki servera i clienta na baciu@mail.ru ia tebe togda tocino scoju v ciom problema |
bobo
|
опубликован 19-08-2001 17:36 MSK
Всё - нашёл ошибку, теперь всё работает. Надо было вместо memset((char*)&server_addr.sin_addr,hp- >h_addr_list,hp->h_length); писать memcpy((char*)&server_addr.sin_addr,hp->h_addr,hp->h_length); |