Новичок
Профиль
Группа: Участник
Сообщений: 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
|