Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Сообщ.
#1
,
|
|
|
сокет работает только в начале
потом ресив ничего не принимает хотя первая передача успешна уверне что нехватает толи сбраса или ещё чегото |
Сообщ.
#2
,
|
|
|
Наверное все таки исходника.
|
Сообщ.
#3
,
|
|
|
всё начал понимать повторный вызов рецив (после удачного) возвращает WSAENOTCONN (10057)
" Socket is not connected. A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. Any other type of operation might also return this error - for example, setsockopt setting SO_KEEPALIVE if the connection has been reset. " я понял что нада сделать КИП ЭЛАЙВ хорошо а если без этого как сделать реконект? |
Сообщ.
#4
,
|
|
|
ты написал какуюто муть. "КИП ЭЛАЙВ" тут не причем.
1. какой сокет создаеш (протокол) 2. конектишся или нет? 3. как посылаеш данные 4. как принимаеш 5. откуда уверенность что сервер не обрывает коннект так как ты ему не нравишся? 6. код покажи |
Сообщ.
#5
,
|
|
|
1. стрим
2. да успешно и более того (пишу простенькую прогу передачи файла) передаю и ПОЛУЧАЮ размер файла в байтах но больше ничего 3. сенд 4. рецив 5. дебагом видел что размер он получает плюс создаются пустые файлы нучжного размера 6. код ы приём void CFtransDlg::OnButton1() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 0 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { /* Tell the user that we could not find a usable */ /* WinSock DLL. */ return; } //////////////////////////////////////////////////////////////////////////////////////////////// UpdateData(1); #define SRV_PORT 1234 #define BUF_SIZE 1000 #define TXT_QUEST "Who are you?\n" int s, s_new; int from_len; // char buf [64]; struct sockaddr_in sin, from_sin; s = socket (AF_INET, SOCK_STREAM, 0); memset ((char *)&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; int PortNum; PortNum = atoi(m_hp.operator LPCTSTR()); sin.sin_port = htons(PortNum); bind (s, (struct sockaddr *)&sin, sizeof(sin)); err= listen (s,SOMAXCONN); from_len = sizeof(from_sin); s_new = accept (s, ( struct sockaddr *)&from_sin, &from_len); char b[20]={0}; recv(s_new,b,20,0);////////////////////////////////////////////////////////////// long bytes; long len; //bytes=atoi(b); sscanf(b,"%d",&bytes); //send(s_new,"OK",3,0);////////////////////////////////////////////////////////////////// len=bytes; //len=50;///////////////////////////////////////////////// FILE *file; file=fopen(m_file.operator LPCTSTR(),"w+"); char buf[1500]={0}; ////////////////// до этого момента всё класс!///////////////////////////////// while (len>=BUF_SIZE) { err= recv(s,buf,BUF_SIZE,0); fwrite(buf,sizeof(char),BUF_SIZE,file); //send(s_new,"OK\0",3,0); len=len-BUF_SIZE; } err= recv(s,buf,len,0); err=WSAGetLastError (); ::AfxMessageBox(buf,0,0); fwrite(buf,sizeof(char),len,file); //send(s_new,"OK\0",3,0); shutdown (s_new, 0); closesocket(s_new); WSACleanup (); fclose(file); } отсыл void CFtransDlg::OnButton2() { #define BUF_SIZE 1000 UpdateData(1); WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 0 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { /* Tell the user that we could not find a usable */ /* WinSock DLL. */ return; } //::AfxMessageBox("STOP03",0,0); SOCKET s = socket(AF_INET, SOCK_STREAM, 0); //hostent* hp; struct hostent* hp; char b[20]={0}; char *pdest; pdest = strchr( m_hp.operator LPCTSTR(), ':' ); *pdest=0; pdest++; int i=0; while(*pdest!=0) { b[i]=*pdest; i++; pdest++; } //::AfxMessageBox("STOP02",0,0); if( (hp=gethostbyname(m_hp.operator LPCTSTR())) == NULL ) { return ; } struct sockaddr_in ssin; memset ((char *)&ssin, '\0', sizeof(ssin)); // memcpy(hp->h_addr_list, &ssin.sin_addr, hp->h_length); // ssin.sin_addr.s_addr=*(unsigned long*)(hp->h_addr); ssin.sin_addr.S_un.S_addr = inet_addr(m_hp.operator LPCTSTR()); ssin.sin_family = hp->h_addrtype; int PortNum; PortNum = atoi(b); ssin.sin_port = htons(PortNum); //::AfxMessageBox("STOP01",0,0); if(connect(s, (struct sockaddr *)&ssin, sizeof(ssin))==-1){ return ; } CFile file; file.Open(m_file.operator LPCTSTR(),CFile::modeRead,NULL); //long len; long len= file.GetLength(); sprintf(b,"%d",len); //sprintf(b,"%d",len); char buf[1500]; bool opt; opt=true; err= setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(const char *)&opt,sizeof(int)); err=send(s,b,strlen(b),0);//////////////////////////////////////////////////// err= setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(const char *)&opt,sizeof(int)); //recv(s,buf,3,0);////////////////////////////////////////////////////////// ////////////////// до этого момента всё класс!///////////////////////////////// while (len>=BUF_SIZE) { file.Read(buf,BUF_SIZE); err=send(s,buf,BUF_SIZE,0); //recv(s,buf,4,0); len=len-BUF_SIZE; } file.Read(buf,len); ::AfxMessageBox(buf,0,0); err=send(s,buf,len,0); err=WSAGetLastError (); // recv(s,buf,4,0); //Sleep(9000); ::AfxMessageBox("STOP00",0,0); shutdown (s, 0); closesocket(s); WSACleanup (); file.Close(); } |
Сообщ.
#6
,
|
|
|
void CFtransDlg::OnButton1() - запускается TCP-сервер
void CFtransDlg::OnButton2() - запускается TCP-клиент Они в одном программном модуле? т.е. разными кнопками программа выходит или в режим клиента, или сервера. Тут можно поподробнее? |
Сообщ.
#7
,
|
|
|
да прога и клиент и сервер естественно для отладки надо 2 запущеных приложения
в мсходниках я написал пометки где у меня до какого момента всё класс и ошибок нет никаких ////////////////// до этого момента всё класс!///////////////////////////////// |
Сообщ.
#8
,
|
|
|
Скорее всего вы рановато закрываете серверный присоединенный сокет
|
Сообщ.
#9
,
|
|
|
Цитата Oleg2004 @ Скорее всего вы рановато закрываете серверный присоединенный сокет ГДЕ??? в том то и дело где я его закрываю?!?!? |
Сообщ.
#10
,
|
|
|
err= setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(const char *)&opt,sizeof(int));
Если вы думаете, что эта опция поддерживает соединение живым (открытым) - так это не так. Ее кстати надо совместно с TCP_KEEPALIVE использовать... Да, уберите из кода все лишнее закоменченное - никак не позволяет сосредоточиться. И укажите точно, где и кто затыкается - неясно. Инструкция ---- и ошибка. |
Сообщ.
#11
,
|
|
|
TCP_KEEPALIVE ??? а де это? может setsockopt(s,IPPROTO_TCP1,SO_KEEPALIVE,(const char *)&opt,sizeof(int));
ибо TCP_KEEPALIVE нет, а для уровня IPPROTO_TCP1 есть только тотже SO_KEEPALIVE ну какие будут идеи ???????? а совсем забыл студия 6 у меня |
Сообщ.
#12
,
|
|
|
IPPROTO_TCP
Константа для указания уровня TCP. TCP_KEEPALIVE Устанавливает интервал времени между пакетами "keep alive" в секундах. Вначале следует активировать опцию SO_KEEPALIVE. Как я уже отметил, для вас это не является необходимым. |
Сообщ.
#13
,
|
|
|
Цитата DINETS @ сокет работает только в начале ... а с чего вы взяли что принимаете весь буффер передачи? while (len>=BUF_SIZE) { err = recv(s, buf, BUF_SIZE, 0); fwrite(buf, sizeof(char), BUF_SIZE, file); //send(s_new,"OK\0",3,0); len = len - BUF_SIZE; } Типа сами так хотите? Вы должны проверять на кол-во принятых байт и именно это значение минусовать от общей длины. TCP Вам НЕ гарантирует приход ПАКЕТОВ(читай квантов передачи!!!) он гарантирует ПОТОК. А это РАЗНЫЕ вещи!!! удачи Вам (круглый) ЗЫ Самая распространённая ошибка при TCP юзанье.. |
Сообщ.
#14
,
|
|
|
Цитата kolobok0 @ Цитата DINETS @ сокет работает только в начале ... а с чего вы взяли что принимаете весь буффер передачи? while (len>=BUF_SIZE) { err = recv(s, buf, BUF_SIZE, 0); fwrite(buf, sizeof(char), BUF_SIZE, file); //send(s_new,"OK\0",3,0); len = len - BUF_SIZE; } Типа сами так хотите? Вы должны проверять на кол-во принятых байт и именно это значение минусовать от общей длины. TCP Вам НЕ гарантирует приход ПАКЕТОВ(читай квантов передачи!!!) он гарантирует ПОТОК. А это РАЗНЫЕ вещи!!! удачи Вам (круглый) ЗЫ Самая распространённая ошибка при TCP юзанье.. вобще замечание оффтоп так как НИЧЕГО неприходит! да я знаю что в пакеты оно группируется но тут это вобще не к месту оно рвётся чегото!!!! лучшеб чтото более нужное посоветывали |
Сообщ.
#15
,
|
|
|
проверку на send/recv не забудь
наподобие send сделай(R_ERROR = -1, R_OK = 0) int MDRVSSend(const SOCKET sock, const char *send_msg, const WORD send_size) { if(!send_msg || send_size < 0) return R_ERROR; int sended = 0, total_sended = 0, counter = 0; while(sended < send_size) { sended = send(sock, send_msg + total_sended, send_size - total_sended, 0); if(sended == SOCKET_ERROR) if(WSAGetLastError() == WSAEWOULDBLOCK) { if(counter > 10) return R_ERROR; counter++; continue; } else break; total_sended += sended; } return total_sended == send_size ? R_OK : R_ERROR; } |
Сообщ.
#16
,
|
|
|
Цитата DINETS @ ...вобще замечание оффтоп так как НИЧЕГО неприходит! да я знаю что в пакеты оно группируется но тут это вобще не к месту оно рвётся чегото!!!!... 1) что значит оффтоп? т.е. до этого куска кода не доходит? почему тогда вводите в заблуждение надписью что работает до сих пор? Просто так поприкалываться захотелось? 2) в пакеты ПРИ ЮЗАНЬЕ TCP слоя как раз НЕ формируются. потому как НЕТ ПОНЯТИЯ ПАКЕТЫ...есть понятие ПОТОК..почуствуйте разницу... 3) Приведённый код НЕ РАБОЧИЙ... 4) Расшифруйте термин "рвёться". где, что рвёться. помню у одного человека тут не рвалось пол года...но то другая история... происходит эксепшен... с чего вы взяли что рвёться? нет такого понятия в МСДНе... есть при вызове функции(метода) такого то, возврат такой...должно быть(ожидаю) такой... сделал то-то и то-то...включил анализатор...приходят(не приходят) пакеты такие то... а то какое то гадание на кофейне... удачи Вам (круглый) ЗЫ Заметьте время теряется из за недопонимания... ЗЫ ЗЫ детский сад... |
Сообщ.
#17
,
|
|
|
Цитата DINETS @ всё начал понимать повторный вызов рецив (после удачного) возвращает WSAENOTCONN (10057) " Socket is not connected. A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. Any other type of operation might also return this error - for example, setsockopt setting SO_KEEPALIVE if the connection has been reset. " я понял что нада сделать КИП ЭЛАЙВ хорошо а если без этого как сделать реконект? я чо на инопланетном говорю или тут у когото мозг в черепе не вмещается???! err= recv(s,buf,len,0); err=WSAGetLastError (); при приёме не входя в цикл (при маленьком файле хотя в цикле тоже) вот тут ошибка! и всё больше негде и КОД РАБОЧИЙ! |
Сообщ.
#18
,
|
|
|
вот
Прикреплённый файлftrans.rar (31.47 Кбайт, скачиваний: 176) |
Сообщ.
#19
,
|
|
|
Давайте только не будем горячиться.....
Ваши объяснения порой действительно трудно понять Итак Вы выполняете: err= recv(s,buf,len,0); и recv() вылетает с ошибкой, что фиксирует: err=WSAGetLastError (); те err=10057 Так что ли? Кстати, так сетевые программы не рекомендуется писать, надо примерно так: // connect to server if ( connect( sock, (sockaddr*) &addr, sizeof( sockaddr ) ) == SOCKET_ERROR ) { int error = WSAGetLastError( ); if ( ( error != WSAEWOULDBLOCK ) && ( error != WSAEINPROGRESS ) ) { fprintf( stderr, "Failed connecting to remote host, %d\n", error ); closesocket(sock); exit( 1 ); } } или так if ((numbytes = recv(sock, buff, MAXDATASIZE, 0)) == SOCKET_ERROR) cout << "recv fail with code " << WSAGetLastError() << endl; И еще ошибочный recv() этот выполняется в серверном варианте или клиентском? Я же вас просил - уберите все коменты (трудно отслеживать ваш код, вы же просите помочь, а сами навстречу не идете)и точно укажите тот recv() - их ведь у вас куча - после которого вылетает ошибка. Добавлено Нда...... Посмотрел на ваш проект......... |
Сообщ.
#20
,
|
|
|
Цитата ошибочный recv() этот выполняется в серверном варианте или клиентском? да в серверной части ОН Батон 1 яж писал выше Добавлено ну а сам проэкт работает? а то тут некоторые.... |
Сообщ.
#21
,
|
|
|
Значит, соединение с сервером установлено было
и accept() прошел А recv() вы делаете на акцептированном сокете? те на сокете, который вернула функция аксепт? |
Сообщ.
#22
,
|
|
|
ЧОРТ я идиот
!!! спасибо я ся долбить ща обстену буду блин да помнится Энштейн сказал что есть две бесконечности это вселенная и человечкая глупость. и добавил что в первой он не уверен... Добавлено .. |
Сообщ.
#23
,
|
|
|
Цитата DINETS @ ну а сам проэкт работает? а то тут некоторые.... попробуйте прогнать несколько сот метров с одного компа на другой. при этом ещё запустите копирование на передатчике или приёмнике с локального диска на локальный диск... полученный файл проверьте...лучше какой нить архив прогоните и запустите верифай... после того как признаете свою горячность - объясню в чём дело более подробно... удачи Вам (круглый) ЗЫ извинения принимаются...все мы такие... |