Привет, я пытаюсь работать с подключением tcp. Я беру имя файла из клиента и отправляю его на сервер. Сервер проверяет, выходит ли файл, или отправляет соответствующее сообщение. Если файл завершен, данные отправляются клиенту. Я получаю содержимое файла только один раз.отправлять только один раз в цикле
программа сервера
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<unistd.h>
int main()
{
int s,b,opt,port,ns,len,recb,sntd;
char server_addr[100],*gets_func;
struct sockaddr_in server,client;
char buff[50];
printf("Enter the port number ");
scanf("%d",&port);
// The socket is now being created
s=socket(AF_INET,SOCK_STREAM,0);
if(s==-1)
{
perror("SOCKET NOT CREATED \n");
close(s);
exit(0);
}
printf("SOCKET SUCCESSFULL ");
printf("\n Do you wish to input address \n 1.YES 2.NO : ");
scanf("%d",&opt);
if(opt==1)
{
printf("Input the address of ther server :");
scanf("%s",server_addr);
printf("%s",server_addr);
server.sin_addr.s_addr=inet_addr(server_addr);
}
else
{
server.sin_addr.s_addr=inet_addr("127.0.0.3");
}
server.sin_family=AF_INET;
server.sin_port=htons(port);
// Bind the server to the given address
b=bind(s,(struct sockaddr*)&server,sizeof(server));
if(b==-1)
{
perror("\nBind not successfull");
exit(0);
}
printf("\nBIND SUCCESSFULL ");
b=listen(s,1);
if(b==-1)
{
perror("Error listening :");
exit(0);
}
printf("\n Socket listening");
len=sizeof(client);
ns=accept(s,(struct sockaddr*)&client,&len);
if(ns==-1)
{
close(s);
exit(0);
}
printf("\nSocket accepted");
while(1)
{
recb=recv(ns,buff,sizeof(buff),0);
if(recb==-1)
{
perror("\nerror receving message : ");
exit(0);
}
if(strcmp(buff,"exit")==0)
break;
printf("\nThe File Path is %s ", buff);
// Accessing the file
char contents[1000],ch;
FILE *fp;
int i=0;
if(access(buff,F_OK)!=-1)
{
fp=fopen(buff,"r");
printf("\n");
while((ch=fgetc(fp))!=EOF)
{
//printf("%c - %d \n",ch,acii);
contents[i]=ch;
i++;
}
fclose(fp);
contents[i]='\0';
puts(contents);
}
else
{
char temp[]="FILE DOES'NT EXITS";
strcpy(contents,temp);
i=strlen(contents);
i++;
}
contents[i]='\0';
sntd=send(ns,contents,sizeof(contents),0);
if(sntd==-1)
{
perror("\nerror sending");
exit(0);
}
//printf("\nSent succesfully");
//printf("\n");
}
close(s);
}
Client Программа
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<unistd.h>
int main()
{
int s,b,opt,port,r,len,sntd,recb;
char server_addr[100],*gets_func;
struct sockaddr_in server,client;
char buff[50];
printf("Enter the port number for client");
scanf("%d",&port);
// The socket is now being created
s=socket(AF_INET,SOCK_STREAM,0);
if(s==-1)
{
perror("SOCKET NOT CREATED \n");
exit(0);
}
printf("SOCKET SUCCESSFULL ");
printf("\n Do you wish to input address for client \n 1.YES 2.NO : ");
scanf("%d",&opt);
if(opt==1)
{
printf("Input the address of ther server :");
scanf("%s",server_addr);
printf("%s",server_addr);
server.sin_addr.s_addr=inet_addr(server_addr);
}
else
{
server.sin_addr.s_addr=inet_addr("127.0.0.3");
}
server.sin_family=AF_INET;
server.sin_port=htons(port);
// Bind the server to the given address
r=connect(s,(struct sockaddr*)&server,sizeof(server));
if(r==-1)
{
perror("Failed connecting");
exit(0);
}
printf("\nConnected succesfully");
while(1)
{
printf("\n Type File name:");
scanf("%s",buff);
sntd=send(s,buff,sizeof(buff),0);
if(sntd==-1)
{
perror("\n Message not send error :");
exit(0);
}
if(strcmp(buff,"exit")==0)
break;
memset(buff,0,50);
recb=recv(s,buff,sizeof(buff),0);
if(recb==-1)
{
perror("\n error receving message : ");
exit(0);
}
buff[recb]='\0';
printf("\n %s", buff);
printf("\n");
}
close(s);
}
Время использования отладчика .... –
Вы вызываете 'recv' и получаете произвольный кусок байтов. Затем вы передаете его в 'strcmp', который предназначен только для строк C-стиля, а не для произвольных фрагментов байтов. Вы игнорируете возвращаемое значение 'recv', поэтому ваш код не имеет представления о том, сколько байтов он имеет или получил это сообщение. –