bugmaker писал(а):
Цитата:
fopen(c,"rb")
send(l,c,sizeof(c), 0)
там действительно одна и та же переменная с?
Цитата:
перенашу по 1024 в массив
а если размер файла не кратен 1024?
Цитата:
отсылаю размер масива
зачем?
Цитата:
между отсылками стоит функция слип
зачем?
Цитата:
в конце отсылаю строку "конец".
Зачем и как?
Цитата:
в остальных он пишет что принял 0 байтов.
man recv:
Цитата:
The return value will be 0 when the peer has performed an orderly shutdown.
вот код.
но помоему в нём ошибок быть не должно,опять же всё работает если запустить на одной машине.
(маленькая ошибка в цикле принятия имени файла,не обращайте на неё внимания)
Цитата:
отсылаю размер масива
зачем?
Цитата:
между отсылками стоит функция слип
зачем?
размер массива,дабы клиент не записывал в фаил весь массив а только ту его часть в которой содержится информация.
слип это как бы задержка,поставил её потомучто до этого он не успевал принимать огромный поток сендов.можно было место слипа поставить рисив цель которого была бы принять от клиента конфармацию того что строка была получена.
Код:
// ---------------------------------server------------------------------------------------
int main(int argc, char *argv[])
{
int i,a,b,l,sin_size,yes=1;
char c[1000];
int chd,ps,ch,count,countt;
char buffer[1024];
long lSize;
FILE *Fp;
struct sockaddr_in my,th;
time_t start_time, cur_time;
WSADATA wsaData;
WSAStartup(MAKEWORD(2,1), &wsaData);
if ((a = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("\nError Socketing\n");
exit(1);
}
/* if (setsockopt(a,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
printf("\nError setcoket\n");
exit(1);
}*/
my.sin_family = AF_INET;
my.sin_port = htons(MYPORT);
my.sin_addr.s_addr = INADDR_ANY;
memset(&(my.sin_zero), '\0', 8);
if (bind(a, (struct sockaddr *)&my, sizeof(struct sockaddr))== -1)
{
printf("\nError Binding\n");
exit(1);
}
memset(c, '\0', 1000);
sin_size = sizeof(struct sockaddr_in);
if (l = listen(a, BACKLOG) == -1)
{
printf("\nError\n");
exit(1);
}
if((l = accept(a,(struct sockaddr *)&th,&sin_size)) == -1)
{
printf("Error");
break;
}
memset(c, '\0', sizeof(c)); // zero the rest of the struct
if(((b = recv(l,c,sizeof(c)-1,0)) == -1)||(b == 0))
{
printf("\nError");
break;
}
if( strcmp(c,"copyf") == 0)
{
memset(c, '\0', sizeof(c));
recv(l,c,sizeof(c)-1,0);
if((Fp=fopen(c,"rb")) == NULL)
{
send(l,"error",5,0);
}
else
{
fseek (Fp , 0 , SEEK_END);
lSize = ftell (Fp);
rewind (Fp);
memset(c, '\0', sizeof(c));
itoa(lSize,c, 10);
if (send(l,c,sizeof(c), 0) == -1)
{
printf("Error Sending");
break;
}
memset(c, '\0', sizeof(c));
countt = 0;
count =0;
ch = 'h';
while(ch != EOF)//(countt < lSize)
{
count = 0;
memset(buffer,'\0',1024);
while((ch != EOF)&&(count < 1024))
{
ch=getc(Fp);
// if(countt < lSize)
// {
if(ch != EOF)
{
buffer[count] = ch;
count++;
countt++;
}
//}
//else
//break;
}
memset(c, '\0', 1000);
itoa(count,c, 10);
if (send(l,c,sizeof(c), 0) == -1)
{
printf("Error Sending");
break;
}
memset(c, '\0', 1000);
printf("send %dbytes\n",count);
sleep(35);
if (send(l,buffer,sizeof(buffer), 0) == -1)
{
printf("Error Sending");
break;
}
memset(buffer,'\0',1024);
sleep(35);
}
memset(c, '\0', 1000);
itoa(4,c, 10);
if (send(l,c,sizeof(c), 0) == -1)
{
printf("Error Sending");
break;
}
memset(c, '\0', 1000);
sleep(100);
/* time(&start_time);
do
{
time(&cur_time);
}
while((cur_time - start_time) < 2);*/
if (send(l,"done",4, 0) == -1)
{
printf("Error Sending");
break;
}
printf("\ndone all");
fclose (Fp);
memset(buffer,'\0',1024);
}
}
closesocket(l);
}
Код:
//---------------------------------client-----------------------------------------------
int main(int argc, char *argv[])
{
struct sockaddr_in th;
int msg,a,b,l,sizes,sin_size,z,count,size,countt,cc;
char ch,c[2000],com[1000],d[1000],read[1025],readd[1024];
struct hostent *h;
FILE *Fp;
WSADATA wsaData;
WSAStartup(MAKEWORD(2,1), &wsaData);
a = socket(AF_INET,SOCK_STREAM,0);
memset(d,'\0',2000);
scanf("%s",&d);
h = gethostbyname(d);
th.sin_family = AF_INET;
th.sin_port = htons(MYPORT);
th.sin_addr.s_addr = inet_addr(d);
memset(&(th.sin_zero), '\0', 8);
connect(a, (struct sockaddr *)&th, sizeof(struct sockaddr));
memset(com,'\0',1000);
scanf("\n%s",com);
if(strcmp(com,"copyf") == 0)
{
if(z = send(a, com, strlen(com), 0) == -1)
{
printf("\nData sent!");
break;
}
printf("\nEnter The Name of file you want to copy (client.c) --- ");
memset(com,'\0',1000);
count =0;
while(com[count-1] != 13)
{
ch = getch();
if(ch != 8)
{
com[count] = ch;
printf("%c",com[count]);
count++;
}
else
{
com[count] = ch;
printf("%c",com[count]);
printf("%c",32);
printf("%c",com[count]);
count--;
}
}
com[count-1] = '\0';
if(z = send(a, com, strlen(com), 0) == -1)
{
printf("\nError Sending\nDisconecting\n");
break;
}
memset(c,'\0',2000);
recv(a,c,sizeof(c),0);
if(strcmp(c,"error") != 0)
{
size = atoi(c);
memset(c,'\0',2000);
memset(read,'\0',1025);
countt = 0;
strcat(com,".bak");
Fp=fopen(com,"wb+");
while( (strcmp(read,"done") != 0) && (strcmp(read,"error") != 0) )
{
memset(readd,'\0',1024);
if(((z = recv(a,readd,1024,0)) == -1)||(z == 0))
{
printf("\nError");
break;
}
sizes = atoi(readd);
printf("\n%d",sizes);
memset(readd,'\0',1024);
memset(read,'\0',1024);
if(((z = recv(a,read,1025,0)) == -1)||(z == 0))
{
printf("\nError");
break;
}
if((strcmp(read,"done") != 0)&&(strcmp(read,"error") != 0))
{
cc=0;
/* while(cc < sizes)
{
putc( read[cc], Fp );
cc++;
}*/
// fprintf(Fp,"%s",read);
countt = countt + 1;
fwrite (read , 1 , sizes , Fp);
}
else
break;
}
if(countt == size)
printf("\nok\n");
else
printf("/nerror/n");
fclose(Fp);
sizes = 0;
}
memset(c,'\0',sizeof(c));
memset(com,'\0',sizeof(com));
memset(read,'\0',1025);
}
}