리눅스 서버 소켓

강한친구·2022년 3월 10일
0

Server Studies

목록 보기
10/27

전체적인 코드 리뷰는 나중에 하고 일단 에러만 살펴보자면

accpet(socklen_t)에러

accpet를 뜯어보면


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

int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

이런 구조로 구성되어있다.

인자 s는 소켓을 듣기 위한 파일지정자, addr은 sockaddr struct의 포인터, 그리고 마지막 addrlen은 addr의 크기이다.

여러곳에서 정보를 찾아보면

    int clnt_addr_size = sizeof(st_clnt_addr);
    int acceptret = accept(serv_sock, (struct sockaddr*) &st_clnt_addr, &clnt_addr_size );

이런식으로 구현하는 경우가 종종 있다. addrlen이 포인터로 값을 받으니깐 뭔가 이렇게하면 될거같긴한데 실제로 해보면 매게변수가 받을 수 없는 값이라고 나온다.

이를 해결해주기 위해 여러 서칭을 한 결과,

    int acceptret = accept(serv_sock, (struct sockaddr*) &st_clnt_addr, (socklen_t*)&clnt_addr_size );

이런식으로 (socklen_t*) 덮어줘야한다.

    int acceptret = accept(serv_sock, (struct sockaddr*) &st_clnt_addr, (socklen_t*)&clnt_addr_size );

내 추론으로는 accept의 3번째 매개변수가 socklen_t 형의 포인터라서 그런거같은데 정확한 이유는 모르겠다.

ISO C++ forbids converting a string constant to ‘char*

    if (serv_sock == -1) errhandle("Socket() err!"); // 소켓에러 처리 

에러메세지 출력부분에서 나타나는 오류이다. 검색결과 errhandle이 char를 받는데 c++ 11부터는 string을 char로 변환하는걸 막아둬서 생긴다는것같다.

    if (serv_sock == -1) errhandle((char*)"Socket() err!"); // 소켓에러 처리 

이런식으로 string을 강제로 char*로 해두면 문제없이 작동한다.

0개의 댓글