보통 이런 에러가 나는경우는, 한쪽에서는 끊었는데 다른 한쪽에서 메시지를 보낸경우 이런 에러를 리턴하게 된다.


한쪽에서 먼저 끊은 이유야 여러가지겠지만, 


본인은 대량의 로드 테스트 클라이언트를 돌리고 있었고, 로직에서 커스텀 핑 체크를 하고있는데, 핑 패킷을 서버가 못받아서 서버에서 일방적으로 끊은 이유였다.


그런데 이 현상은 와이파이를 쓸때만 일어나고, 유선으로 하면 발생하지 않았다.


이유가 무엇일까?


와이파이 네트웤 속도가 느려서 로드 테스트를 돌리는 대량의 패킷들이 병목으로 쭉 쌓였다가 한방에 서버한테 넘어가는 것이다.


서버에서는 bufferevent_setwatermark 로 맥스 버퍼 사이즈를 정해놓고 있는데, 이 수치를 넘어가는 패킷들이 몰려오니까 나머지는 짤려서 패킷이 유실되는 경우가 발생하고 있던 것이다.


그래서 클라이언트는 아무리 핑을 보내도 서버가 받지 못해서 not alive 유저로 판단해서 끊어 버리기 때문에, 클라에서 다음 패킷을 보낼때 socket bronken pipe가 전달되었던 것이다.

'TCP/IP' 카테고리의 다른 글

Socket broken pipe  (0) 2019.02.20
sockaddr vs sockaddr_in  (0) 2015.08.01

sockaddr 은 소켓 operation에서 쓰이는 일반적인 주소 struct type이다.
sockaddr_in 은 IP 기반 internet 커뮤니케이션을 위한 주소 struct type이다.

struct sockaddr{
    unsigned short   sa_family;
    char             sa_data[14];
};

sockaddr_in은 sockaddr로 convert되도록 마지막 8byte의 char 패딩을 둠으로써 scokaddr과 동일사이즈로 정의되어있다.

struct sockaddr_in {
    short int            sin_family;
    unsigned short int   sin_port;
    struct in_addr       sin_addr;
    unsigned char        sin_zero[8];
};

struct in_addr {
    unsigned long s_addr;
};

'TCP/IP' 카테고리의 다른 글

Socket broken pipe  (0) 2019.02.20
sockaddr vs sockaddr_in  (0) 2015.08.01

+ Recent posts