Новичок
Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.3.2009
Репутация: нет Всего: 1
|
Добрый день! Пишу клиент и сервер с передачей текстового файла от клиента серверу. Задачу нужно решить с использованием неблокирующих сокетов. Всё в принципе работает, но файл почему-то передаётся не всегда, кроме того, если запускаю отдельно экзешники (т.е. не из билдера), то файл не передаётся вообще. Вот код клиента и сервера, и ещё приложен архив с проектом. Буду очень благодарна за помощь! Клиент: Код | //--------------------------------------------------------------------------- #include <stdio.h> #include <winsock2.h> #include <windows.h> #include <conio.h> #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused WSADATA ws;//информация о сокете int main(int argc, char* argv[]) { int sock; struct sockaddr_in addr; if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws))) { perror("WSAStartup"); system("pause"); exit(1); } sock=socket(AF_INET, SOCK_STREAM,0); if (sock<0) { perror("socket"); system("pause"); exit(2); } addr.sin_family=AF_INET; addr.sin_port=htons(666); addr.sin_addr.s_addr=htonl(INADDR_LOOPBACK); if(connect(sock,(struct sockaddr *)&addr,sizeof(addr))<0) { perror("connect"); system("pause"); exit(3); } FILE *F; if (!(F=fopen("1.txt","r"))) { perror("Open File"); system("pause"); exit(4); }; char s[80]; char p[80]; while(!feof(F)) { fgets(s,80,F); send(sock, s,sizeof(s),0); recv(sock,p,sizeof(s),0); printf("%s",p); }; printf("\nThe file transfer completed.\n"); fclose(F); delete(F); F = NULL; closesocket(sock); system("pause"); return 0; }
|
Сервер: Код | //--------------------------------------------------------------------------- #include <stdio.h> #include <winsock2.h> #include <windows.h> #include <algorithm> #include <set> using namespace std; #include <time.h> #include <conio.h> #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused //--------------------------------------------------------------------------- int Number; WSADATA ws;//информация о сокете int main(int argc, char* argv[]) { // Шаг 1 - инициализация библиотеки Winsock if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws))) { perror("WSAStartup"); system("pause"); exit(1); } // Шаг 2 - создание сокета SOCKET sock, listener; struct sockaddr_in addr; char buf[1024]; int bytes_read; listener = socket(AF_INET, SOCK_STREAM, 0); if(listener < 0) { perror("socket"); system("pause"); exit(2); } ULONG ulBlock; ulBlock = 1; //аналог fcntl if (ioctlsocket(listener, FIONBIO, &ulBlock) == SOCKET_ERROR) { perror("ioctlsocket_listener"); system("pause"); exit(3); } // Шаг 3 - установка соединения // заполнение структуры sockaddr_in // указание адреса и порта сервера addr.sin_family = AF_INET; addr.sin_port = htons(666); addr.sin_addr.s_addr = INADDR_ANY; if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); system("pause"); exit(4); } listen(listener, 1); Number = 0; FD_SET ReadSet; int ReadySock; set<int> clients; clients.clear(); // цикл извлечения запросов на подключение из // очереди while(1) { // Заполняем множество сокетов FD_ZERO(&ReadSet); FD_SET(listener, &ReadSet); for(set<int>::iterator it = clients.begin(); it != clients.end(); it++) FD_SET(*it, &ReadSet); // Задаём таймаут timeval timeout; timeout.tv_sec = 15; timeout.tv_usec = 0; // Ждём события в одном из сокетов int mx = max(listener, *max_element(clients.begin(), clients.end())); if ((ReadySock = select(mx+1, &ReadSet, NULL, NULL, &timeout)) == SOCKET_ERROR) { perror("Select"); system("pause"); exit(6); } if (FD_ISSET(listener, &ReadSet)) { sock = accept(listener, NULL, NULL); if (sock == INVALID_SOCKET) { perror("accept"); break; } if (ioctlsocket(sock, FIONBIO, &ulBlock) == SOCKET_ERROR) { perror("ioctlsocket_sock"); break; } //добавили в список clients.insert(sock); } for(set<int>::iterator it = clients.begin(); it != clients.end(); it++) { if(FD_ISSET(*it, &ReadSet)) { Number++; // увеличиваем счетчик // подключившихся клиентов AnsiString filename; filename = "Res"+IntToStr(Number)+".txt"; FILE *F; if (!(F = fopen(filename.c_str(),"w"))) { perror("Create File"); break; }; while( (bytes_read = recv(*it, buf, 1024, 0))>0 ) { fprintf(F,buf); printf(buf); // Отправляем данные обратно клиенту send(*it, buf, bytes_read, 0); } fprintf(F,"\0"); fclose(F); delete(F); F = NULL; closesocket(*it); clients.erase(*it); } printf("\nReceiving the file %d is complete.\n",Number); } } closesocket(sock); closesocket(listener); _exit(0); return 0; } //---------------------------------------------------------------------------
|
Присоединённый файл ( Кол-во скачиваний: 9 )
AClientServer.rar 674,28 Kb
|