WebSocket 서버를 PHP로 만들 때 handshake 데이터를 계산할 때 주의사항이 있다.

PHP는 unsigned integer를 지원하지 않는다.
그래서 큰 수가 필요하면 float 형으로 형변환해서 계산하면 되지만, 기본적으로 정수와 실수는 데이터의 저장형태가 달라서 같은 연산결과를 기대할 수 없는 경우가 있다.
특히 handshake 에서 /key-number_N/ 과 /spaces_N/ 값을 이용하여 유효성 검사를 할 때,
나머지 연산을 하게 되는데 /key-number_N/ 값이 10자리의 숫자이므로 PHP integer의 한계치인 32-bit signed integer 의 범위를 넘어가기 십상이다.

그렇다고 float으로 형변환 한 다음 수행하는 나머지 연산은 절망만을 안겨준다...-_-;

그래서 나머지 연산을 위한 함수같은게 따로 하나 필요하다.
아래의 함수같은 것.

function mod($a, $b)
{
    $mod = '';

    $a = strval($a);
    $b = strval($b);

    $len = strlen($a);
    for ($i=0; $i<$len; $i++) {
        $x = $mod.$a[$i];
        $mod = $x % $b;
    }

    return $mod;
}





Posted by bloodguy
,