2017-01-31 14 views
-1

Привет, я пытаюсь работать с подключением 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); 
} 
+0

Время использования отладчика .... –

+1

Вы вызываете 'recv' и получаете произвольный кусок байтов. Затем вы передаете его в 'strcmp', который предназначен только для строк C-стиля, а не для произвольных фрагментов байтов. Вы игнорируете возвращаемое значение 'recv', поэтому ваш код не имеет представления о том, сколько байтов он имеет или получил это сообщение. –

ответ

1

TCP является протоколом байт потока, а не протокол обмена сообщениями. Если вы хотите отправлять и получать сообщения, вам нужно будет написать функцию «отправить сообщение» и «получить сообщение» и вызвать их. Вы не можете просто позвонить recv и ожидать, что он узнает, что такое ваши сообщения, потому что он понятия не имеет.

+0

, что делает мне проблему с плохим адресом –

+0

Возможно, это потому, что вы закрыли гнездо для прослушивания. Но у вас гораздо большие проблемы. –

+0

Да, я узнал, что ошибка ... извините за поздний ответ ..... это сработало как шарм –