Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> winsock2 клиент сервер, удаленный обзор папок 
:(
    Опции темы
Karser
  Дата 5.6.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 19.5.2007

Репутация: нет
Всего: нет



Клиент цепляется к серваку и запрашивает его файловую систему,так называемый файловый менеджер,
Хотя программа в целом работает,
сервак с клиентом беспорядочно выдают ошибки,
еще когда запускаешь 2 клиента,начинаются глюки.
Помогите ,пожалуйста  :wacko 
Вот тут коды сервака с клиентом,заодно прикрепил ахрив с исходниками
Клиент:
Код

//---------------------------------------------------------------------------
#include <stdio.h>
#include <math.h>
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
  #include <string.h>
  #include <winsock2.h>
  #include <windows.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

Tcln *cln;SOCKET my_sock;String n;
String last;

void show(char buf[1024])
{
 strcat(buf,"\\");
 send(my_sock,&buf[0],1024,0);
 char tmp[1000];
 sprintf(tmp, "Отправлен запрос на каталог %s", buf);
 cln->ListBox1->Items->Add(tmp);

 cln->ListBox2->Clear();
 /*for (int g=0;g<10;g++)buf[g]='\0';
 recv(my_sock,&buf[0], 1024, 0);

 sprintf(tmp, "В каталоге %s файлов", buf);
 cln->ListBox1->Items->Add(tmp);

 int res = atoi(buf);
 String h; char ff[1024]="";
 for(int z=0;z<res-1;z++){
   recv(my_sock,&ff[0],1024, 0);
   cln->ListBox2->Items->Add(ff);
  for (int g=0;g<100;g++)ff[g]='\0';
  }
 */
 char ff[1024]="";
 do
 {
   for (int g=0;g<100;g++)ff[g]='\0';
   recv(my_sock,&ff[0],1024, 0);
   if (ff[0]!='.') cln->ListBox2->Items->Add(ff);
 }
 while (ff[0]!='.');
}

//---------------------------------------------------------------------------
__fastcall Tcln::Tcln(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------


void __fastcall Tcln::ListBox2DblClick(TObject *Sender)
{
last=ListBox2->Items->Strings[ListBox2->ItemIndex];
show(ListBox2->Items->Strings[ListBox2->ItemIndex].c_str());
}
//---------------------------------------------------------------------------


void __fastcall Tcln::Connect1Click(TObject *Sender)
{

    char buff[1024];
    // Шаг 1 - инициализация библиотеки Winsock
    if (WSAStartup(0x202,(WSADATA *)&buff[0]))
    {
      n="WSAStart error   ";n+= WSAGetLastError();
      ListBox1->Items->Add( n );
    }
    // Шаг 2 - создание сокета
    my_sock=socket(AF_INET,SOCK_STREAM,0);
    if (my_sock < 0)
    {
      n="Socket error   ";n+= WSAGetLastError();
      ListBox1->Items->Add(n);
    }

    // Шаг 3 - установка соединения
    sockaddr_in dest_addr;
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(ep->Text.ToInt());
    HOSTENT *hst;

    // преобразование IP адреса из символьного в
    // сетевой формат
    if (inet_addr(e1->Text.c_str())!=INADDR_NONE)
      dest_addr.sin_addr.s_addr=inet_addr(e1->Text.c_str());
    else
      // попытка получить IP адрес по доменному
      // имени сервера
      if (hst==gethostbyname(e1->Text.c_str()))
      // hst->h_addr_list содержит не массив адресов,
      // а массив указателей на адреса
      ((unsigned long *)&dest_addr.sin_addr)[0]=
        ((unsigned long **)hst->h_addr_list)[0][0];
      else
      {
      n= "Invalid address   127.0.0.1";
      ListBox1->Items->Add(n);
        closesocket(my_sock);
        WSACleanup();
      }

    // адрес сервера получен – пытаемся установить
    // соединение
    if (connect(my_sock,(sockaddr *)&dest_addr,
                sizeof(dest_addr)))
    {
      n= "Connect error "; n+=WSAGetLastError();
      ListBox1->Items->Add(n);
    }

    n= "Соединение с  успешно установлено,    "; n+=e1->Text.c_str();
    ListBox1->Items->Add(n);
        
}
//---------------------------------------------------------------------------

void __fastcall Tcln::Disconnect1Click(TObject *Sender)
{
    n= "Recv error "; n+=WSAGetLastError();
    ListBox1->Items->Add(n);
    closesocket(my_sock);
    WSACleanup();        
}
//---------------------------------------------------------------------------

void __fastcall Tcln::Send1Click(TObject *Sender)
{
char path[1024]="c:";
show(path);
}
//---------------------------------------------------------------------------

void __fastcall Tcln::Button1Click(TObject *Sender)
{
int i=0;
i=strlen(last.c_str());
while (last[i]!='\\') {
last[i]='\0';
i--;
}
last[i]='\0';
show(last.c_str());
}
//---------------------------------------------------------------------------


Сервер:
Код

#include <vcl.h>
#include <stdio.h>
#pragma hdrstop 

#include "serv.h"
#include "winsock2.h"

#define PORT 666
#define SERVERADDR "127.0.0.1"
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
Tsys *sys;
SOCKET mainsock,clientsock;

void ListFiles(AnsiString path, TStrings* List)
{
// Эта процедура выводит список файлов
TSearchRec sr;
if (FindFirst(path+"*.*", faAnyFile, sr) == 0)
{
 do
 {
 if ((sr.Attr & faDirectory)&&(sr.Name!=".")&&(sr.Name!=".."))
  {
   AnsiString Ext=ExtractFileExt(sr.Name).UpperCase();
   List->Add(path+sr.Name);
  }
 }
 while (FindNext(sr) == 0);
 FindClose(sr);

Application->ProcessMessages();
}
}

//---------------------------------------------------------------------------
__fastcall Tsys::Tsys(TComponent* Owner)
: TForm(Owner)
{
}

//---------------------------------------------------------------------------
void Tsys::OnSocket(TMessage par)
{
String h,Mes;


  switch(par.LParamLo) {
    case FD_ACCEPT: {
      h="FD_ACCEPT  =  ";h+= par.LParamLo;
      ListBox1->Items->Add(h);
      clientsock=accept(mainsock,NULL,NULL);
      if (WSAAsyncSelect(clientsock,Handle,WM_SOCKET,FD_READ|FD_CLOSE)!=0) exit(0);
      break;
    }
    case FD_CLOSE:{
      h="FD_CLOSE  =  ";h+= par.LParamLo;
      ListBox1->Items->Add(h);
      shutdown(clientsock ,SD_BOTH);
      closesocket(clientsock);
      shutdown(par.WParam,SD_BOTH);
      closesocket(par.WParam);
      void activ();
      break;
    }
    case FD_READ:{
                                  h="FD_READ  =  ";h+= par.LParamLo;
                                  ListBox1->Items->Add(h);
      char i[1024]="";
      for (int g=0;g<1024;g++)i[g]='\0';
      recv(clientsock, &i[0], 1024, 0);

      char tmp[1000];
      sprintf(tmp, "Запрос на каталог %s", i);
      ListBox2->Items->Add(tmp);
                                  //h="<<-  ";h+=i[0];
                                  //ListBox2->Items->Add(h); //sizeof(int)

      Memo1->Clear();
      strcat(i,"\0");
      ListFiles(i,Memo1->Lines);
      sprintf(i, "%d\0",Memo1->Lines->Count);
      /*send(clientsock,&i[0], 1024, 0);
                                        sprintf(tmp, "Кол-во файлов -  %s", i);
                                        ListBox2->Items->Add(tmp);
      */
      for (int z=0;z<Memo1->Lines->Count;z++){
      Memo1->Lines->Strings[z]+='\0';

      send(clientsock,Memo1->Lines->Strings[z].c_str(),1024,0);
      }
      send(clientsock,".", 1024, 0);
      break;
    }
  }
}

void __fastcall Tsys::FormCreate(TObject *Sender)
{
  WSADATA w;
  int error = WSAStartup (0x0202, &w);
  if (error){
    WSACleanup();
    exit(0);
  }
  if (w.wVersion != 0x0202)
  {
    WSACleanup();
    exit(0);
  }
mainsock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind(mainsock, (LPSOCKADDR)&addr, sizeof(addr))==SOCKET_ERROR) exit(0);
if(listen(mainsock, 1)==SOCKET_ERROR)exit(0);
HWND hwndWindow;
hwndWindow=FindWindow(NULL, sys->Caption.c_str());
if (WSAAsyncSelect(mainsock,hwndWindow,WM_SOCKET,FD_ACCEPT)!=0) exit(0);
}
//---------------------------------------------------------------------------


Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  cl_sv.rar 49,11 Kb
PM MAIL   Вверх
Nil
Дата 5.6.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Код

 for (int g=0;g<100;g++)ff[g]='\0';
   recv(my_sock,&ff[0],1024, 0);

1) Если я правильно понял назначение первой строки тут, то лучше memset
2) recv возвращает количество реально прочитанных байт из сокета, вам следует выполнять проверку этого значения, ибо может вообще произойти ошибка. И еще, tcp/ip потоковый протокол, так что нет никакой гарантии того что если вы шлете отдельными пакетами имена файлов то они и придут отдельными пакетами...Они могут прийти в одном пакете.

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0405 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.