tonykang22 / study

0 stars 0 forks source link

[리눅스 개발환경] 20. 소켓 옵션 & 주소 정보 #91

Open tonykang22 opened 2 years ago

tonykang22 commented 2 years ago

20. 소켓 옵션 & 주소 정보

소켓 옵션

#include <sys/types.h>
#include <sys/socket.h>

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);



SO_KEEPALIVE


SO_LINGER

struct linger {
    int l_onoff;     /* linger active */
    int l_linger;    /* how many seconds to linger for */
};
struct linger so_linger = {.l_onff=1, .;_linger=0};
if (setsockopt(fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger)) == -1) { /* error */}


SO_RCVBUF / SO_SNDBUF


SO_RCVTIMEO / SO_SNDTIMEO


SO_REUSEADDR


TCP_MAXSEG


TCP_NODELAY



소켓 주소 정보

#include <sys/socket.h>

int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);


예제

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

int main(int argc, char *argv[]) 
{
    char myIP[16];
    unsigned int myPort;
    struct sockaddr_in server_addr, my_addr; 
    int sockfd;

    if (argc < 3) {
        printf("Usage: %s <IP> <Port>\n", argv[0]); 
        exit(1);
    }

    // Connect to server
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket error");
        exit(1); 
    }

    // Set server_addr
    bzero(&server_addr, sizeof(server_addr)); 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = inet_addr(argv[1]);
    server_addr.sin_port = htons(atoi(argv[2]));

    // Connect to server
    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("connect error"); 
        close(sockfd);
        exit(1);
    }

    // Get my ip address and port
    bzero(&my_addr, sizeof(my_addr));
    int len = sizeof(my_addr);
    getsockname(sockfd, (struct sockaddr *) &my_addr, &len);
    inet_ntop(AF_INET, &my_addr.sin_addr, myIP, sizeof(myIP)); 
    myPort = ntohs(my_addr.sin_port);

    printf("Local ip address: %s\n", myIP); 
    printf("Local port : %u\n", myPort);

    close(sockfd);
    return 0; 
}


image