2016-03-22 14 views
1

Merhaba, iki farklı işletim sistemi sistemleri arasında Sunucu istemcisi geliştiriyorum. Windows üzerinde Ubuntu 14.04 & İstemci üzerinde sunucu çalıştırıyorum.Sunucu İstemci uygulaması TCP/IP protokolünü kullanarak c

/* Simple Server code on TCP/IP protocol */ 

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

#define length 512 
void error(const char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 

int main(int argc, char *argv[]) 
{ 
    int sockfd, newsockfd, portno; //Declare variable for Socket and port 
    socklen_t clilen; //Client address and port no 
    char buffer[length]; //Buffer for message 

    struct sockaddr_in serv_addr, cli_addr; //Srtructure for server and Client address 
    int n; //Check whether listen,accept,read,write process done 
    FILE *fileptr; //File pointer 
    int datasize; 

    /* Check Portno. provided or not */ 
    if (argc < 2) { 
     fprintf(stderr,"ERROR, no port provided\n"); 
     exit(1); 
    } 

    /*Create socket*/ 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 

    bzero((char *) &serv_addr, sizeof(serv_addr)); //Clear memory for Server address 
    portno = atoi(argv[1]); //Convert portno in to Integer from ASCII 

    /*Server address and all other details */ 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 

    /*Bind socket*/ 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, 
       sizeof(serv_addr)) < 0) 
       error("ERROR on binding"); 

    /*Listening to socket and waiting for users(max.5) */ 
    listen(sockfd,5); 

    clilen = sizeof(cli_addr); //Size of Client address 

    /*Accept users*/ 
    newsockfd= accept(sockfd,(struct sockaddr *) &cli_addr,&clilen); 
    if (newsockfd< 0) 
      error("ERROR on accept"); 


    /*File operations */ 
    char* fs_name = "/home/ankur/Desktop/RTSIM_Dump.csv"; 
    fileptr=fopen(fs_name,"r"); //Open file 

    /*Write and Read operation to socket*/ 

    bzero(buffer,length); 
    while((datasize = fread(buffer,sizeof(char),length,fileptr))>0) 
    { 
     if(send(newsockfd,buffer,datasize,0)<0) 
     { 
       fprintf(stderr, "ERROR: Failed to send file :%s (errno = %d)\n",fs_name,errno); 
      break; 
     } 
     bzero(buffer,length); 
    } 


    fclose(fileptr); //Close file 
    close(newsockfd); //Close to accept client 
    close(sockfd); //close socket 


    return 0; 
} 


//Client code: 
------------------------------------------------------------------------------#define WIN32_LEAN_AND_MEAN 

#define _WIN32_WINNT 0x0501 

#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 


// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib 
#pragma comment (lib, "Ws2_32.lib") 
#pragma comment (lib, "Mswsock.lib") 
#pragma comment (lib, "AdvApi32.lib") 


#define DEFAULT_BUFLEN 512 
#define DEFAULT_PORT "2222" 

int __cdecl main(int argc, char **argv) 
{ 
    WSADATA wsaData; 
    SOCKET ConnectSocket = INVALID_SOCKET; 
    struct addrinfo *result = NULL, 
        *ptr = NULL, 
        hints; 
    char sendbuf[DEFAULT_BUFLEN]; 
    char recvbuf[DEFAULT_BUFLEN]; 
    int iResult; 
    int recvbuflen; 
    FILE *fileptr; 

    // Validate the parameters 
    if (argc != 2) { 
     printf("usage: %s server-name\n", argv[0]); 
     return 1; 
    } 

    // Initialize Winsock 
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
    if (iResult != 0) { 
     printf("WSAStartup failed with error: %d\n", iResult); 
     return 1; 
    } 

    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 

    // Resolve the server address and port 
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); 
    if (iResult != 0) { 
     printf("getaddrinfo failed with error: %d\n", iResult); 
     WSACleanup(); 
     return 1; 
    } 

    // Attempt to connect to an address until one succeeds 
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) { 

     // Create a SOCKET for connecting to server 
     ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
      ptr->ai_protocol); 
     if (ConnectSocket == INVALID_SOCKET) { 
      printf("socket failed with error: %ld\n", WSAGetLastError()); 
      WSACleanup(); 
      return 1; 
     } 

     // Connect to server. 
     iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); 
     if (iResult == SOCKET_ERROR) { 
      closesocket(ConnectSocket); 
      ConnectSocket = INVALID_SOCKET; 
      continue; 
     } 
     break; 
    } 

    freeaddrinfo(result); 

    if (ConnectSocket == INVALID_SOCKET) { 
     printf("Unable to connect to server!\n"); 
     WSACleanup(); 
     return 1; 
    } 


//Receive file from Server and save it. 

     fileptr = fopen("/Desktop/RTSIM_Dump.csv","w"); 
     if (fileptr == NULL) 
     { 
      printf("ERROR:Create/Open file"); 
      exit(1); 
     } 
     int write_sz; 
     memset(recvbuf,0,DEFAULT_BUFLEN); 
     while((recvbuflen = recv(ConnectSocket,recvbuf,DEFAULT_BUFLEN,0))>0) 
     { 
      write_sz = fwrite(recvbuf,sizeof(char),recvbuflen,fileptr); 
      if(write_sz < recvbuflen) 
      { 
       printf("File write failed.\n"); 
      } 
       memset(recvbuf,0,DEFAULT_BUFLEN); 
       if(recvbuflen == 0 || recvbuflen != 512) 
       { 
        break; 
       } 
     } 
     if(recvbuflen < 0) 
     { 
       printf("recv() timed out.\n"); 
     } 

    // cleanup 
    fclose(fileptr); 
    closesocket(ConnectSocket); 
    WSACleanup(); 

    return 0; 
} 

--------------------------------------- --------------------------------------- Sunucuda errno 104 alıyorum (Ubuntu) & Windows'ta dosya oluştur/aç.

Şimdiden teşekkürler!

Ubuntu'da sunucu istemcisini kontrol ettim, ancak mükemmel bir şekilde çalışıyor ancak ben Windows istemcisi ile denediğinde. Uygulama sırasında bana hata veriyor. Pencereler için yanlış yolu

+0

Windows makinenizde gerçekten bir '/ Desktop' dizininiz var mı? –

+0

Aptalca bir hata yaptım. Ancak sunucu tarafında hala hata veriyor 104 –

cevap

0
fileptr = fopen("/Desktop/RTSIM_Dump.csv","w"); 

. Daha uygun olan "\Desktop\RTSIM_Dump.csv" olacaktır. Yoldaki dizinlerin bulunması ve uygun izinlere sahip olması gerektiğini unutmayın.

Sunucuda 104 hatası nereden alıyorsunuz?

+0

104 (bağlantıyı peer ile sıfırlama) büyük olasılıkla 'gönder '(istemciden bağlanan ancak herhangi bir şey almadan önce dosya hatasıyla ölen müşteriden) gelir. –

+0

Evet, sunucuya errno alıyorum 104. –

+0

İstemci kodunda değişiklik önerdim. Çalışıyor, ancak şimdi istemci sadece 1.9 KB alıyor. Benim dosyamdan daha fazla veri var. –

İlgili konular