Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#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; } |