Написал код по установлению соединения между двумя компами в локалке, отправки и пересылки данных на винсоке 2-ом на TCP, но по интересной причине клиент спокойно создал сервак и ждёт коннекта со стороны сервера, отдающего команды, но несмотря на то, что сервер обращаеться по нужному порту и в нужное время, вылетает WSAETIMEDOUTERROR, думал просто глюк, но это повторилось, переписал на UDP, потом юзал сетевые компоненты обоих протоколов - тот же результат, при этом во всех случаях я могу подключиться из коммандной строки к своей проге, а так - нет Порасспросил администраторов про прокси, стоит только http, да и зачем сокс в вузе, но это не отменяет того, что есть доверенные приложения и моя прога в их ряд не входит Честно говоря не знаю в чём дело, уже почитал indy in depth но ответа там не нашёл Все Kerberosовские штучки виндоус не включены Я в этом деле человек не очень опытный, поэтому не ожидал таких трудностей Не подскажете в чём дело, а то я в тупике
ничего не понял что значит с кем он общается? Если клиент ждет коннекта со стороны сервера. Короче код клиента в студию (хотя бы подпрограмма которая устанавливает соединение)
вполне возиможно наличие соотв. образом настроенных фаерволов на данных компьютерах стоит проверить на предмет соответствия IP и портов код тоже бы посмотреть
окей вот код удп проектов (тут правда другая последовательнсть отправки, это наскоряк писал, чтобы проверить) код клиента Код (Text): program UDPClient; uses windows, winsock2; const Serv='86.102.1.172'; ////В оригинале здесь был хост, но я в ipconfig посмотрел айпишник на данный ////момент и чтобы не тратить время аодключался по нему Var wsd:TWSADATA; s:TSocket; server:TSockAddrIn; {host:Phostent; } mes:string; begin if WSAStartUp(MAKEWORD(2,2),wsd)<>0 then begin MessageBox(0,'Initialize error','Error',MB_ICONERROR); halt; end; mes:='Hi, idiot!!!'; S:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); If S=INVALID_SOCKET then begin MessageBox(0,'Socket Error','Error',MB_ICONERROR); WSACleanUp; halt; end; server.sin_family:=AF_INET; server.sin_port:=htons(5050); server.sin_addr.S_addr:=inet_addr(Serv); {host:=gethostbyname(Serv); if host=nil then begin MessageBox(0,'Host Error','Error',MB_ICONERROR); WSACleanUp; halt; end; copymemory(@server.sin_addr,host.h_addr_list,host.h_length);} sendto(s,mes,15,0,server,sizeof(server)); end. вот сервака Код (Text): program UDPServer; uses winsock2, windows; function NetThreadProc(lpParam:pointer):dword; Var Server:Tsocket; localaddr,clientaddr:TSockAddrIn; size:integer; s:string; begin Server:=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); If Server=INVALID_SOCKET then begin MessageBox(0,'Socket Error','Error',MB_ICONERROR); WSACleanUp; halt; end; localaddr.sin_addr.S_addr:=htonl(INADDR_ANY); localaddr.sin_family:=AF_INET; localaddr.sin_port:=htons(5050); if bind(Server,@(SockAddr(localaddr)),sizeof(localaddr))=SOCKET_ERROR then begin MessageBox(0,'Bind Error','Error',MB_ICONERROR); WSACleanUp; halt; end; MessageBox(0,'Bind OK','Warning',MB_ICONWARNING); repeat Size:=sizeof(clientaddr); if recvfrom(Server,s,sizeof(s),0,clientaddr,Size)<>(sizeof(s)-4) then MessageBox(0,'Receive Error','Error',MB_ICONERROR) else MessageBox(0,PChar(s),'Warning',MB_ICONWARNING); until false; end; Var wsd:TWSADATA; netThread:THandle; NetThreadId:dword; begin if WSAStartUp(MAKEWORD(2,2),wsd)<>0 then begin MessageBox(0,'Initialize error','Error',MB_ICONERROR); halt; end; NetThread:=CreateThread(nil,0,@NetThreadProc,nil,0,NetThreadID); sleep(infinite); end. Короче с кодом всё нормально вроде, просто корпоративная политика гробит всё порты свободные я смотрел net stat -a и они свободны, порты соответсвуют, время работы прог совпадает, сервак точно занимает указанный порт и ждёт соединения, позвольте спросить в чём дело, или хотя бы подскажите где это искать
как бы сделай тцп как и собирался с начала, это делаецо так: Код (Text): program Client; uses windows, winsock; const Serv='127.0.0.1'; Var wsd:TWSADATA; s:TSocket; server:TSockAddrIn; {host:Phostent; } mes:string; begin if WSAStartUp($101,wsd)<>0 then begin MessageBox(0,'Initialize error','Error',MB_ICONERROR); halt; end; mes:='Hi, idiot!!!'; S:=Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); If S=INVALID_SOCKET then begin MessageBox(0,'Socket Error','Error',MB_ICONERROR); WSACleanUp; halt; end; server.sin_family:=AF_INET; server.sin_port:=htons(5050); server.sin_addr.S_addr:=inet_addr(Serv); connect(s,server,sizeof(server)); send(s,PCHAR(@mes[1])^,15,0); end. и сервант к нему Код (Text): program cServer; uses winsock, windows; Var Server,ACpted:Tsocket; localaddr,clientaddr:TSockAddrIn; size:integer; s:string; wbuff:array[0..255]of char; wsd:TWSADATA; netThread:THandle; NetThreadId:dword; begin if WSAStartUp($101,wsd)<>0 then begin MessageBox(0,'Initialize error','Error',MB_ICONERROR); halt; end; Server:=Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); If Server=INVALID_SOCKET then begin MessageBox(0,'Socket Error','Error',MB_ICONERROR); WSACleanUp; halt; end; localaddr.sin_addr.S_addr:=htonl(INADDR_ANY); localaddr.sin_family:=AF_INET; localaddr.sin_port:=htons(5050); if bind(Server,localaddr,sizeof(localaddr))=SOCKET_ERROR then begin MessageBox(0,'Bind Error','Error',MB_ICONERROR); WSACleanUp; halt; end; listen(Server, 0); if WSAGetLastError<>0 then begin //eshe raz tvoia messaga exit; end; MessageBox(0,'Bind OK','Warning',MB_ICONWARNING); while true do begin ZeroMemory(@wbuff,256); ACpted := accept(Server,nil,nil); if(ACpted<>INVALID_SOCKET)then begin recv(ACpted,pchar(@wbuff[0])^,256,0); MessageBox(0,pchar(@wbuff[0]),'ПЫТЫЩ!!!',0); ACpted:=0; sleep(1); end else break;//if not invalid end;//while end. вот. это по мотивам твоего сорца, наглядно так выразил.. уверен - поймёшь..
я более-менее знаю как это делается, если и прокалываюсь, то в деталях просто в то время под рукой кода не было этого короче, у меня всё тоже самое, только там у меня zeromemory нету и стринги передаю только сценаий другой: серер прежде чем биндиться подключается к клиентскому серваку и отсылает ему комманду, а уже потом биндит свой сервер и ждёт ответа от клиента Ща скину код, только у мя вопрос почему у тя в listen ноль стоит, то есть типа он никого принимать не будет что ли? Вот код клиента Код (Text): program client; uses windows, winSock2, jokes in 'jokes.pas'; ///мой модуль по названию думаю понятно чего const MaxLength=100; type MsgString=String[MaxLength]; function ClientThread(s:TSocket):integer; Var RecvBuff,SendBuff:MsgString; ret:integer; begin result:=0; SendBuff:='done'; repeat ret:=recv(s,RecvBuff,sizeof(RecvBuff),0); if ret=0 then break else If ret=SOCKET_ERROR then begin MessageBox(0,'Receive Error','Error',MB_ICONERROR); dec(result,1); break; end; MessageBox(0,'Receive Success','Error',MB_ICONERROR); if RecvBuff[1]='R' then begin Run(@Gallutination); ///упрощенная процедура запуска потока ret:=send(s,SendBuff,sizeof(SendBuff),0); If ret=SOCKET_ERROR then begin MessageBox(0,'Send Error','Error',MB_ICONERROR); dec(result,2); break; end; end else MessageBox(0,'What the hell was sent there??!!!','Error',MB_ICONERROR); sleep(50); until false; end; function NetThread:integer; Var Client,Server:TSocket; ret,Size:integer; serverAddr,clientAddr:sockaddr_in; Thread:THandle; ThreadId:dword; Begin result:=0; Server:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); If Server=SOCKET_ERROR then begin Dec(result,1); ////это я на буущее, чтобы потом знать чё случилось и когда MessageBox(0,'Creation server socket error','Error',MB_ICONERROR); exit; end; ServerAddr.sin_family:=Af_INET; ServerAddr.sin_port:=htons(5050); ServerAddr.sin_addr.S_addr:=htonl(INADDR_ANY); ret:=bind(Server,@(SockAddr(ServerAddr)),sizeof(ServerAddr)); if ret=SOCKET_ERROR then begin Dec(result,2); MessageBox(0,'Bind error','Error',MB_ICONERROR); exit; end; listen(Server,1); ////почемму и тя здесь стоит, и как это тогда работает? repeat Size:=sizeof(clientaddr); Client:=accept(Server,clientaddr,size); if Client=INVALID_SOCKET then begin MessageBox(0,'Accept Error','Error',MB_ICONERROR); dec(result,3); break; end; Thread:=CreateThread(nil,0,@ClientThread,@Client,0,ThreadID); If thread=0 then begin MessageBox(0,'Thread Error','Error',MB_ICONERROR); dec(result,4); break; end; CloseHandle(Thread); until false; closeSocket(client); end; Var wsd:TWSAData; pNetThread:THandle; NetThreadId:dword; begin if WSAStartup(Makeword(2,2),wsd)<>0 then begin MessageBox(0,'WSAInitializing Error','Error',MB_ICONERROR); halt; end; repeat pNetThread:=CreateThread(nil,0,@NetThread,nil,0,NetThreadId); sleep(300000); terminateThread(NetThread,0); until false; WSACleanUp; end. вот код главного сервака Код (Text): uses windows, WinSock2; const MaxLength=100; ClientName='86.102.1.172'; type MsgString=String[MaxLength]; function ClientThread(lparam:pointer):integer; Var RecvBuff:MsgString; ret:integer; s:TSocket; begin repeat s:=TSocket(lparam^); result:=0; ret:=recv(s,RecvBuff,maxLength,0); if ret=0 then break else if ret=SOCKET_ERROR then begin dec(result,1); break; end; until false; if recvBuff[1]='d' then MessageBox(0,'All is OK. Command has received','Error',MB_ICONERROR) else MessageBox(0,'What the hell was send there??!!!','Error',MB_ICONERROR); CloseSocket(s); end; function NetThread(localaddr:sockaddr_in):integer; Var Server,Client:TSocket; Thread:THandle; ThreadId:dword; Size:integer; clientaddr:TSockAddrIn; Begin result:=0; Server:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); If server=SOCKET_ERROR then begin dec(result,1); MessageBox(0,'Creation Server Socket Error','Error',MB_ICONERROR); exit; end; if bind(Server,@(SockAddr(localaddr)),sizeof(localaddr))=SOCKET_ERROR then begin dec(result,2); MessageBox(0,'Bind Error','Error',MB_ICONERROR); exit; end; listen(Server,15); repeat Size:=sizeof(clientaddr); client:=accept(Server,SockAddr(clientaddr),Size); If Client=INVALID_SOCKET then begin dec(result,3); MessageBox(0,'Accept Error','Error',MB_ICONERROR); break; end; Thread:=CreateThread(nil,0,@ClientThread,@Client,0,ThreadId); if Thread=0 then begin dec(result,4); break; end; CloseHandle(Thread); sleep(50); until false; closeSocket(Server); end; Var wsd:TWSAData; FNetThread:THandle; NetThreadID:dword; ret1:integer; s:TSocket; buf:Msgstring; {host:Phostent;} localaddr,clientaddr:sockaddr_in; port:word; st:string; begin if WSAStartUp(MAKEWORD(2,2),wsd)<>0 then halt; S:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); If s=SOCKET_ERROR then begin MessageBox(0,'Creation socket error','Error',MB_ICONERROR); WSACleanUp; halt; end; port:=htons(5050); localaddr.sin_addr.S_addr:=htonl(INADDR_ANY); localaddr.sin_family:=AF_INET; localaddr.sin_port:=port; clientaddr.sin_family:=AF_INET; clientaddr.sin_port:=port; clientaddr.sin_addr.S_addr:=inet_addr(ClientName); {host:=GetHostbyName(ClientName); if host=nil then begin MessageBox(0,'Host Error','Error',MB_ICONERROR); WSACleanUp; halt; end; CopyMemory(@clientaddr.sin_addr,host.h_addr,host.h_length);} ret1:=connect(s,@(SockAddr(clientaddr)),sizeof(clientaddr)); If ret1=SOCKET_ERROR then begin case WSAGetLastError of WSAETIMEDOUT: st:='WSAETIMEDOUT'; WSAEADDRINUSE: st:='WSAEADDRINUSE'; WSAEADDRNOTAVAIL: st:='WSAEADDRNOTAVAIL'; WSAENETDOWN: st:='WSAETIMEDOUT'; ///вот он злостный враг коннекта WSAEINTR: st:='WSAEINTR'; WSAEINPROGRESS : st:='WSAEINPROGRESS'; WSAEALREADY: st:='WSAEALREADY'; WSAEAFNOSUPPORT: st:='WSAEAFNOSUPPORT'; WSAECONNREFUSED: st:='WSAECONNREFUSED'; WSAEFAULT: st:='WSAEFAULT'; WSAEINVAL: st:='WSAEINVAL'; WSAEISCONN : st:='WSAEISCONN'; WSAENETUNREACH : st:='WSAENETUNREACH'; WSAENOBUFS : st:='WSAENOBUFS'; WSAENOTSOCK: st:='WSAENOTSOCK'; WSAEWOULDBLOCK : st:='WSAEWOULDBLOCK'; WSAEACCES : st:='WSAEACCES'; else st:='UNKNOWN'; ///кстати недавно я ещё и эту ошибку словил, но это уже дома было end; MessageBox(0,PAnsiChar(st+' error'),'Error',MB_ICONERROR); WSACleanUP; halt; end; buf:='Run'; ret1:=send(s,Buf,sizeof(buf),0); if ret1=SOCKET_ERROR then begin MessageBox(0,'First Sending Error','Error',MB_ICONERROR); WSACleanUP; halt; end; repeat FNetThread:=CreateThread(nil,0,@NetThread,@Localaddr,0,NetThreadId); sleep(300000); terminateThread(FNetThread,0); until false; WSACleanUp; end. жду ваших замечаний и предложений, прошу вас сосредоточиться именно на установлении соединения, остальные некрасивости будут исправлены, как только решится эта проблема
=|| я кагбе проверил счас даже, всё работает чудесно. тока пщпщ второй параметр в листен это беклог. я его всю жезь нулём ставлю.. такщо идите курите мсдн. сделойте всё как у мну. вплоть до ВстаСтартуп(БАКС202,...); и Socket(PF_INET
А что касается наличие запрещающих прог, типа файерволлов и соксов, как с ними поступать если я наконец-то удостоверюсь в их наличии?
seiko PF_INET - обязательно. параметр бэклог в функции listen означает максимальную вместимость очереди еще не принятых подключений передача заведомо некорректного значения гарантирует то, что будет выбрано ближайшее допустимое значение. можно передавать не 0, а SOMAXCONN например
ни фига - вылазит таймаут все равно, короче я не знаю уже чё мне делать по ходу сокс стоит здесь как всегда написал код перед этим узнал состояние портов net statом после запуска клиента узнал о том, что его сервак забиндился успешно и ждёт, вот только к нему никак не может подключиться другой комп, выдаёт таймаут, хотя в реальном времени все в поряде, как всегда подключился из коммандной строки к своему клиенту, жаль, что передать ничё не смог Ради эксперимента включил на этих двух компах messenger и успешно обменялся сообщениями с помощью NET SENDа, пробовал искать фаейвол в службах, но ничего не нашёл придётся опять выуживать скудную инфу из наших админов, но я боюсь это безнадёжно, если я под админом ни хера сделать не могу, то тут уж застреливаться надо помогите чем-нить блин, я уже с середины сентября так маюсь, пробуя разные варианты, и никуда не продвинулся.
есть ли у нода32 или mcAfee встроенные файерволы, которые будучи сервисами могут блокировать подозрительные соединения?
Седня пытался отключить IMON в ноде, вроде отключил, код не менял, но после отключения начались странные глюки, ошибка бинда, да ещё и какая - WSAENOTSOCK - дельфа мне утверждает что, данный дескриптор не является сокетом, хотя переданный до этого в функцию параметр - результат спокойного и без ошибок вызова функции socket Целых два странных парадокса, первый - после отключения предполагаемого файервола приложение даже сервер забиндить не может, второй - это то, что функция бинда не признаёт свой нормальный сокет И непонятно, в чем проблема Каковы будут ваши соображения и что такое LPS?
повторил те же опыты по коннекту дома, перед этим отключил брандмауэр и каспера на обоих компах Дома у меня стоит локалка, по этому же кабелю к моему компу проходит интернет с ADSL модема, суть в чём пробовал на UDP, на TCP, менял местами сервак и клиент: все равно одна шняга - WSAETIMEDOUTERROR. Сетевые компоненты как idUDPServer и idUDPClient тупо стесняются сказать об ошибке и зависают нахрен при попытке выполнять функции простейшего чата (пример из Delphi глазами хакера). В чём может быть проблема, помогите плиз, я в который раз понимаю, что я ни черта не знаю о сети. Я уже устал от книжек, котрые сулят мне быстрый успех, но вместо этого ничего не работает из-за непонятных ошибок
Единственное, что в гулгле выдается если набрать только слово WSAETIMEDOUTERROR выдает только ссылку на мой пост здесь
Помогите плиз, есть какие-нибудь идеи, я лишь могу добавить, что через коммандную строку прекрасно подключаюсь к своему клиенту
В TCP и UDP ошибка WSAETIMEDOUT так и переводиться, превышение времени ожидания прихода пакета, но в UDP это в принципе не редкость, то в TCP это означает, что либо не открыт порт назначения, либо пакет потерялся по пути, или не смог подключиться. Но суть в том, что эта ошибка возникает постоянно, какие механизмы слежения и противодействия помимо прокси серверов применяются в локальных сетях, и могут ли они являться причиной?
может ли быть причиной проблемы сетевая политика компании-поставщика интернета, если по тому же кабелю переносится подключение по интернету от WAN компании?