2016-04-22 8 views
0

Die folgenden sind meine Codes für Server- und Client-File Transfer und Modifikation Buchse mit

server.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h>   
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <errno.h> 
#include <signal.h> 
#include <unistd.h> 

#define PORT 9999 
#define MAXBUFF 3 


void sig_chld(int n){ 
    int status; 

    while(waitpid(-1,&status,WNOHANG)>0); 

} 

void main(){ 

    int sockfd,clientfd; 
    char buffer[1024]={0}; 
    char path[1024]={0}; 
    char client_IP[INET_ADDRSTRLEN]; 
    void sig_chld(int); 
    struct sockaddr_in server,client; 


    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ 
     perror("sockfd err\n"); 
    } 


    server.sin_family=AF_INET; 
    server.sin_port=htons(PORT); 
    server.sin_addr.s_addr=INADDR_ANY; 
    memset(server.sin_zero, '\0', sizeof server.sin_zero); 

    if(bind(sockfd,(struct sockaddr *)&server,sizeof(server))==-1){ 
     perror("Not bind\n"); 
     exit(errno); 

    } 


    if(listen(sockfd,10)==-1){ 
     perror("Not listen"); 
     exit(errno); 
    }else{ 
     printf("Listening\n"); 

    } 

    signal(SIGCHLD, sig_chld); 
    int le=sizeof(client); 

    while(1){ 

    if((clientfd=accept(sockfd,(struct sockaddr *)&client,&le))==-1){ 
     if(errno==EINTR) 
      continue; 
     else{   
     perror("accept\n"); 
     exit(errno); 
     } 
    } 

    if(fork()==0){ 
    close(sockfd); 
    bzero(buffer,sizeof(buffer)); 
    bzero(path,sizeof(path)); 


    inet_ntop(AF_INET,&(client.sin_addr),client_IP,sizeof(client)); 
    printf("IP of client is %s and port is %d\n",client_IP,client.sin_port); 

    //receiving the pah of the file 
    recv(clientfd,path,sizeof(path),0); 
    FILE *fp; 
    fp = fopen(path, "a+"); 

    char *s=NULL; 

    //sending the file 
    while(fgets(buffer,sizeof(buffer),(FILE*)fp)){ 

    int n=0; 
    n=send(clientfd,buffer,strlen(buffer)+1,0); 
    printf("%d %d\n",strlen(buffer),n); 
    bzero(buffer,sizeof(buffer)); //imp 
    printf("In while loop\n"); 
    } 

    bzero(buffer,sizeof(buffer)); 
    //waiting for a modification 
    //not able to recieve from client on this line 
    recv(clientfd, buffer, sizeof(buffer), 0);  
    printf("After recv"); 
    fputs(buffer,fp); 



    exit(0);  
    } 
    close(clientfd); 

} 

    close(sockfd); 


} 

client.c

/****************** CLIENT CODE ****************/ 

#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <string.h> 

int main(){ 
    int clientSocket; 
    char buffer[1024]={0}; 

    bzero(buffer,sizeof(buffer)); 
    struct sockaddr_in serverAddr; 
    socklen_t addr_size; 

    clientSocket = socket(AF_INET, SOCK_STREAM, 0); 

    serverAddr.sin_family = AF_INET; 
    serverAddr.sin_port = htons(9999); 
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); 

    addr_size = sizeof serverAddr; 
    connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size); 

    //sending the Name of the file 
    send(clientSocket,"text",strlen("text")+1,0); 

    FILE *fp; 
    fp = fopen("client.txt", "a+"); 

//receiving the file 
int n=0; 
while((n=recv(clientSocket, buffer, sizeof(buffer), 0))>0){ 
    /*---- Print the received message ----*/ 
    fputs(buffer,fp);  
    printf("Data received %sand n is: %d\n",buffer,n); 
    bzero(buffer,sizeof(buffer)); 
} 
    //sending a modification 
    //Unable sending 
    send(clientSocket,"modification",strlen("modification")+1,0); 



    close(clientSocket);  
    return 0; 
} 


dies in der Client sendet ein Datei NAME zum Server. Der Server sendet die Datei an den Client Der Client speichert die Datei (mit einer Änderung) und schlägt eine Änderung vor, und der Server fügt die Änderung der Datei hinzu. Allerdings kann ich die MODIFIKATIONEN ("Modifikationszeichenfolge im Code") vom Client nicht empfangen.

Kann jemand vorschlagen, was im Code falsch ist. Manchmal wird die Datei auch teilweise gesendet.

+0

Client unter Gdb laufen lassen, habe ich Zweifel, ob es sogar send-Funktion als nicht blockierende empfangen würde warten für immer eine Nachricht zu kommen –

+0

Dies hat alle üblichen Aspekte. Fehler bei der korrekten und vollständigen Behandlung der von syscalls (insbesondere recv) zurückgegebenen Ergebnisse, Missbrauch von Puffern, die nicht mit Null abgeschlossen wurden, und Fehler beim Entwerfen rund um die Octet-Streaming-Natur von TCP. –

Antwort

1

Wie durch den Namen SOCK_STREAM angezeigt wird TCP ist ein Streaming Protokoll, ohne Nachrichten Grenzen. Es kann leicht passieren, dass ein Anruf an recv Ihnen keine vollständige Nachricht gibt, oder wenn das andere Ende schnell ist, mehr als eine Nachricht (oder sogar Kombinationen davon, wie eine und eine Teilnachricht). Wenn Sie wissen möchten, wann eine Nachricht endet und eine andere beginnt, müssen Sie ein einfaches Protokoll über TCP implementieren, das diese Dinge behandelt.

Das könnte den Teil Ihrer Frage erklären.

+0

Teil Teil wie in Teildateiübertragung ?? –

+0

@AdityaSharma Ja –

+1

Zeichenpuffer [1024]; int receive_total = 0; while (receive_total