2017-12-11 22 views
-3

두 개의 다른 함수 인 서버 IP 주소와 학생 ID에서 반환되는 두 값을 연결하려고합니다. 이러한 함수를 얻는 데 사용 된 함수는 서버에 액세스하기위한 void 함수입니다. strcat() 기능을 사용하고 싶지만 성공적으로 작동시키지 못합니다. 다음 코드는 서버에서 단일 값을 모두 성공적으로 반환합니다.strcat()를 사용하여 void 함수에서 수집 한 두 값을 연결합니다.

void get_ipaddress(void) 
{ 
    int fd; 
    struct ifreq ifr; 

    printf("IP Address:"); 

    fd = socket(AF_INET, SOCK_DGRAM, 0); 

    /* I want to get an IPv4 IP address */ 
    ifr.ifr_addr.sa_family = AF_INET; 

    /* I want an IP address attached to "eth0" */ 
    strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); 

    ioctl(fd, SIOCGIFADDR, &ifr); 

    close(fd); 

    /* Display result */ 
    printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); 
} 


void get_studentid(int socket) 
{ 
    char studentid[32]; 
    size_t k; 

    readn(socket, (unsigned char *) &k, sizeof(size_t)); 
    readn(socket, (unsigned char *) studentid, k); 

    printf("Student ID: %s\n", studentid); 
} // end get_studentid() 

I 출력을

192.168.229.128 얻기 위해 노력하고 있어요 : S1427722

내가 이전에 오류

잘못된 사용을 반환 시도 코드를 공백 표현

,
+1

여기서 strcat은 무엇입니까? – Sudhee

+0

그것은 거기에 없어, 난 시행 착오를 사용하여 여러 가지 방법으로 strcat() 및 구현할 때마다, "식의 잘못된 사용"반환합니다, 3 시간 동안 그것을 그래서 어떤 구현을 몰랐다 –

+1

아 - 두 포인터를 모두 반환하지는 않습니다. 그래서 당신은 strcat() 안에서 사용할 수 없다. – Sudhee

답변

1

함수 get_ipaddress해야 하나의 malloc 및 IPv4 주소를 반환하거나 기입 할 문자열/문자 []를들 수. 동일해야

void get_ipaddress(char *addr, int n) 
{ 
    /* ... */ 

    // Copy the string into our buffer 
    strncpy(addr, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr), n); 
} 

get_studentid : 그래서 당신은 그것을 바꿀 수 주에서 지금

void get_studentid(int socket, char *studentid, int n) 
{ 
    size_t k; 
    unsigned char *buf; 

    readn(socket, (unsigned char *) &k, sizeof(size_t)); 
    buf = malloc(k); 
    readn(socket, buf, k); 

    strncpy(studentid, buf, n); 
    free(buf); 

} // end get_studentid() 

을 그리고 당신은 할 수 있습니다 :

int main(void) { 
    char s_id[32] = {0}; 
    char ipaddr[32] = {0}; 
    char output[64] = {0}; 
    int sock; 

    // Call the functions 
    get_ipaddress(ipaddr, 32); 
    // Open your socket here 
    get_studentid(sock, s_id, 32); 

    // Format the output 
    snprintf(output, 64, "%s: %s", ipaddr, s_id); 
    // Print the result 
    printf("%s\n", output); 
} 

이 sprintf를 이용합니다() 이 형식은 strcat보다 두 배 (":"및 studentid)를 연결해야하기 때문에 strcat보다 더 좋습니다.

+3

버퍼로 포인터를 가져 와서 채우는 함수는 ** 항상 ** 또한 다음과 같은 인수를 가져야합니다. 버퍼의 사이즈 그렇지 않으면 모든 종류의 버퍼 오버 플로우 문제가 발생합니다. –

+0

@ChrisDodd 네가 맞아, 코드를 빨리 작성했지만 좋은 연습을해야 할 것이다. 답변이 업데이트되었습니다. –

+0

@JacobH 이것은 환상적인 코드이지만 코드 구현과 관련하여 세그먼트 오류가 발생합니다. 메뉴 옵션에서 코드를 실행할 때 함수의 이름 뒤에() 안에 어떤 것이 있어야합니까? –