2017-11-07 1 views
0

나는 어디에서나 대답을 찾고 있습니다. 나는 C 언어로 코딩하는 것을 처음 봤고 교수가 우리에게 언어를 선택할 수있게 허용한다면 그것을 사랑했을 것이다. 그러나 나는 빗 나간다. Oracle Ubuntu 클라이언트와 Ubuntu 서버를 로컬에서 실행하는 Oracle V-Box를 실행하고 있습니다. 아래의 코드를 몇 가지 경고와 함께 서버와 클라이언트 모두에서 컴파일합니다. 나는 서버에서 코드를 실행하고 (괜찮아 보입니다) 클라이언트에서 실행합니다. 클라이언트는 TCP 소켓 전송 (위대한 기능)과 마찬가지로 PDF 파일을 보내달라고 요청합니다. Wireshark도 클라이언트와 서버에서 실행 중이며 요청이 클라이언트에서 전송 된 것처럼 보입니다. 그러나 서버는 아무 것도하지 않고 파일을 가져 오지 않고 양끝에 있습니다. 코드인지 아니면 다른 것인지 확실하지 않습니다.UDP 클라이언트/서버 c

./udp_server 

그냥 클라이언트에서 기다리고 앉아 : 나는 일반적으로 서버에서 코드를 실행 컴파일하면

/* Echo server using UDP */ 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

#define SERVER_UDP_PORT  2466  
#define MAXLEN  4096 

int main(int argc, char **argv) 
{ 
    int  sd, client_len, port, n; 
    char buf[MAXLEN]; 
    struct sockaddr_in  server, client; 

    switch(argc) { 
    case 1: 
     port = SERVER_UDP_PORT; 
     break; 
    case 2: 
     port = atoi(argv[1]); 
     break; 
    default: 
     fprintf(stderr, "Usage: %s [port]\n", argv[0]); 
     exit(1); 
    } 

    /* Create a datagram socket */ 
    if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
     fprintf(stderr, "Can't create a socket\n"); 
     exit(1); 
    } 

    /* Bind an address to the socket */ 
    bzero((char *)&server, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(port); 
    server.sin_addr.s_addr = htonl(INADDR_ANY); 
    if (bind(sd, (struct sockaddr *)&server, 
      sizeof(server)) == -1) { 
     fprintf(stderr, "Can't bind name to socket\n"); 
     exit(1); 
    } 

    while (1) { 
     client_len = sizeof(client); 
     if ((n = recvfrom(sd, buf, MAXLEN, 0, 
          (struct sockaddr *)&client, &client_len)) < 0) { 
      fprintf(stderr, "Can't receive datagram\n"); 
      exit(1); 
     } 

     if (sendto(sd, buf, n, 0, 
        (struct sockaddr *)&client, client_len) != n) { 
      fprintf(stderr, "Can't send datagram\n"); 
      exit(1); 
     } 
    } 
    close(sd); 
    return(0); 
} 

는 클라이언트 코드

// UDP Echo Client 

#include <stdio.h> 
#include <string.h> 
#include <sys/time.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#define SERVER_UDP_PORT   2466 
#define MAXLEN     4096 
#define DEFLEN     64 

long delay(struct timeval t1, struct timeval t2) 
{ 
    long d; 
    d = (t2.tv_sec - t1.tv_sec) * 1000; 
    d += ((t2.tv_usec - t1.tv_usec + 500)/1000); 
    return(d); 
} 

int main(int argc, char **argv) 
{ 
    int  data_size = DEFLEN, port = SERVER_UDP_PORT; 
    int  i, j, sd, server_len; 
    char *pname, *host, rbuf[MAXLEN], sbuf[MAXLEN]; 
    struct hostent   *hp; 
    struct sockaddr_in  server; 
    struct timeval   start, end; 
    unsigned long address; 

    pname = argv[0]; 
    argc--; 
    argv++; 
    if (argc > 0 && (strcmp(*argv, "-s") == 0)) { 
     if (--argc > 0 && (data_size = atoi(*++argv))) { 
      argc--; 
      argv++; 
     } 
     else { 
      fprintf(stderr, 
        "Usage: %s [-s data_size] host [port]\n", pname); 
      exit(1); 
     } 
    } 
    if (argc > 0) { 
     host = *argv; 
     if (--argc > 0) 
      port = atoi(*++argv); 
    } 

    else { 
     fprintf(stderr, 
       "Usage: %s [-s data_size] host [port]\n", pname); 
     exit(1); 
    } 

    if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
     fprintf(stderr, "Can't create a socket\n"); 
     exit(1); 
    } 

    bzero((char *)&server, sizeof(server)); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(port); 
    if ((hp = gethostbyname(host)) == NULL) { 
     fprintf(stderr, "Can't get server's IP address\n"); 
     exit(1); 
    } 
    bcopy(hp->h_addr, (char *) &server.sin_addr, hp->h_length); 

    if (data_size > MAXLEN) { 
     fprintf(stderr, "Data is too big\n"); 
     exit(1); 
    } 
    for (i = 0; i < data_size; i++) { 
     j = (i < 26) ? i : i % 26; 
     sbuf[i] = 'a' + j; 
    } // construct data to send to the server 
    gettimeofday(&start, NULL); /* start delay measurement */ 
    server_len = sizeof(server); 
    if (sendto(sd, sbuf, data_size, 0, (struct sockaddr *) 
       &server, server_len) == -1) { 
     fprintf(stderr, "sendto error\n"); 
     exit(1); 
    } 
    if (recvfrom(sd, rbuf, MAXLEN, 0, (struct sockaddr *) 
       &server, &server_len) < 0) { 
     fprintf(stderr, "recvfrom error\n"); 
     exit(1); 
    } 
    gettimeofday(&end, NULL); /* end delay measurement */ 
    if (strncmp(sbuf, rbuf, data_size) != 0) 
     printf("Data is corrupted\n"); 
    close(sd); 
    return(0); 
} 

입니다. 나는 클라이언트에서 코드를 실행 컴파일하면

:

./udp_client -s 1500 10.0.2.11 2466 > test.pdf 

나는

((출력은 클라이언트의 바탕 화면)에 ./udp_client -s data_rate server_IP SERVER_PORT 파일>)되는이 실행 이것은 그냥 빈 페이지를 만듭니다. 텍스트와 사진이 몇 페이지 있어야합니다.

또한 Wireshark의 클라이언트에서 발송을 받고 있지만 서버의 응답은 없습니다.

이 내가 그냥 클라이언트에서 수신 된 데이터를 출력하는 것을 잊었다 생각 나는 터미널

strace ./udp_server

+0

'strace'에서 서버를 실행하십시오. 이것은 엄청난 양의 도박을 일으킬 것입니다. 터미널에서 분출이 멈출 때까지 기다리십시오. 그런 다음, control-C를 치지 말고 질문에 마지막 10 ~ 15 줄의 gobbledygook을 복사하여 지나치십시오. 그런 다음 보내는 클라이언트를 실행하십시오. 이로 인해 서버가 실행중인 터미널 창에 더 많은 내용이 나타나게되면 그 내용을 질문에 복사하여 붙여 넣으십시오 (다시 UNEDITED). – zwol

+2

디버거에서 서버를 실행하여 패킷 수신 여부를 확인 했습니까? – Barmar

+1

또한 서버에서 Wireshark를 실행하여 패킷을 수신하는지 확인하십시오. – Barmar

답변

2

에서 strace를 실행하면 내가 얻고 무엇을 :

if (strncmp(sbuf, rbuf, data_size) != 0) 
    printf("Data is corrupted\n"); 
close(sd); 

printf(rbuf); // <---- 

return(0); 

귀하 클라이언트 코드는 현재 오류 메시지 만 출력합니다. 모든 것이 작동하면 출력이 나오지 않습니다.

+0

OP에 wireshark에서 서버의 응답이 표시되지 않는다고 말합니다. –

+1

@MartinJames : 코드를 로컬에서 테스트했는데 예상 한 결과가 나타납니다. – Blender

+0

변경 사항을 실행하려고 시도했지만 성공하지 못했습니다. – MathiasKroll