Страница 2 из 2
Добавлено: 18 июн 2005, 21:11
RevYurMIh
Переслал получается то же самое.recv возращ. колич. байт=размеру константы ту которую получил+ размер этой херни
Добавлено: 20 июн 2005, 10:51
Eugie
Т.е. recv() возвращает в буфере пересылаемую строку или текст ошибки?
Добавлено: 21 июн 2005, 20:36
RevYurMIh
Возращает в буфере И пересылаемую строку И текст ошибки
Добавлено: 21 июн 2005, 22:17
Eugie
Ну очень странно...
А насчет Unicode/ANSI - неплохо бы взглянуть, как объявлен buff_cl. И выложи кусок кода побольше, с инициализацией. Что она, кстати, возвращает в WSADATA?
Добавлено: 22 июн 2005, 01:34
RevYurMIh
поток сервера(для каждого клиента создается свой)
DWORD WINAPI MainForClient(LPVOID client_socket)
{
SOCKET my_sock;
my_sock=((SOCKET *) client_socket)[0];
char buff_cl[1024];
char curr_dr[40]="c:\\";
char mask[10]="*.*";
char curr_dr_mask[50]="c:\\";
char *sz;
char temp[10];
int bytes_recv;
WIN32_FIND_DATA fd;
HANDLE h;
// long size,size2;
DWORD dw=0;
send(my_sock,sHELLO,SIZE,0);
while(bytes_recv=recv(my_sock,buff_cl,sizeof(buff_cl),0)
!=SOCKET_ERROR)
{
//client write dir
if(!strncmp(buff_cl,"dir",3))
{
strcpy(curr_dr_mask,curr_dr);
strcat(curr_dr_mask,mask);
buff_cl[0]=0;
sprintf(buff_cl,TEXT("Path: %s"),curr_dr);
send(my_sock,buff_cl,SIZE,0);
if(h=FindFirstFile((LPCTSTR)curr_dr_mask,&fd))
do{
buff_cl[0]=0;
strcat(buff_cl,fd.cFileName);
if(fd.dwFileAttributes!=
FILE_ATTRIBUTE_DIRECTORY)
{
sz=FileSizeInString(fd.nFileSizeHigh,
fd.nFileSizeLow);
strcat(buff_cl,"(");
strcat(buff_cl,sz);
strcat(buff_cl,"kb)");
}
send(my_sock,buff_cl,SIZE,0);
}while(FindNextFile(h,&fd));
}
....................................//шлю сообщение что закончилась передача инф-и
send(my_sock,ENDSTR,sizeof(ENDSTR),0);
}
nclients--;
printf("client disconnect\n"); PRINTNUSERS
closesocket(my_sock);
return 0;
}
КЛИЕНТ
while(1){
printf("cmd>"); gets(buff);
//get files in cur. dir
send(my_sock,&buff[0],SIZE,0);
if (!strcmp(&buff[0],"quit"))
{
printf("Exit...");
closesocket(my_sock);
WSACleanup();
return 0;
} else
//download
if (!strncmp(&buff[0],"down",4))
{
strcpy(fname,&buff[5]);
h=CreateFile((LPCTSTR)fname,
GENERIC_WRITE,FILE_SHARE_READ,
NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);
if(h==INVALID_HANDLE_VALUE) printf("Cannot create output file!\n");
filedownloaded=1;
}
do{
nsize=recv(my_sock,&buff[0],
SIZE,0);
if(!filedownloaded){
buff[nsize]=0;
CharToOem(buff,buff);
printf("%s\n",buff);
}
else
{
if(strcmp(buff,ENDSTR)){
WriteFile(h,buff,nsize,&dw,NULL);
printf("Package number:%lu\r",i++);
}else{ printf(ENDSTR);filedownloaded=0;
i=1;
CloseHandle(h);
}
}
}while(strcmp(buff,ENDSTR));
}
Добавлено: 23 июн 2005, 11:58
Eugie
А где инициализация сокетов?
По тому, что ты выложил, явных причин описанной ошибки я не вижу. Но что мне не нравится - ты в send() всюду посылаешь не длину пересылаемых данных (что было бы логично для строк) и даже не длину буфера, а какие-то константы. Это плохо по-любому. Советую также для начала не использовать многопоточность. Сначала добейся работоспособности single-threaded сервера. Кстати, неплохо бы глянуть, как ты запускаешь потоки - может там собака зарыта.
RevYurMIh, на будущее - пользуйся тегами code, без них тяжело читать код.