본문 바로가기

socket

(6)
리눅스에서 빠르게 TCP socket 서버 찾기. 리눅스에서 자신의 IP 영역대에서 (A.B.C.n, n = 1~자기자신~255) 다른 서버가 있는지 찾기 위해서는 여러 방법이 있긴 하겠지만, 대부분 이 방법으로 찾는게 아닐까 합니다. 아래 코드는 해당 ip 에 TCP socket 이 열려 있는지 찾는 간단한 방법 으로 실제 AnyStreaming Client 에서도 아래와 같은 방법으로 (물론 Windows용으로 바꾼 코드) AnyStreaming 을 찾습니다. 실제론 FD_ISSET() 이후에 socket 을 다시 blocked 로 바꾼 다음 send() 를 통해 특정 명령이 전달 되는지 까지 검사하면 더 좋을 듯 합니다. 이 방법은 TCP socket 의 connect() 함수가 blocking 으로 동작 하는것을 감안해서 만든 날림 코드지만 꽤 ..
HTTP/1.1 의 POST 때문에 살짝 고민한 문제 .... 이전에 만든 HTTP/1.0 용 socket source 를 POST 까지 되도록 버그를 수정 하면서 HTTP/1.1 으로 호환되게 변경 하다 보니 알수 없는 문제를 격었습니다. 바로 해당 서버(Apache2 + PHP5) 에서 $_POST[x] method 를 이용해서 넘어 온 것이 없는 듯이 인식 한다는 점 이었습니다만, 여러번의 시도 중 다음 header 인자가 중요하다는 것을 알았습니다. 바로 Content-Type 이 문제 였습니다. PHP5 에서 제대로 POST 되는 내용을 알려면 Content-Type 을 application/x-www-form-urlencoded 로 써야 인식을 하는 것 이었습니다. 기존엔 text/html 로 mime 을 지정해서 보냈더니 이걸 인식 못하는 문제를 이제 ..
의문 : winsock 에서 connect 에서 ERROR_ACCESS_DENIED 반환 !!! 현재 간단한 소켓을 통한 메시지 전송(명령어 일종)을 구현 중인데, 이게 이상한게 gcc 에서 컴파일하거나 해서 돌리면 잘 도는 것이 동일한 Windows API 를 이용해서 Delphi 에서 구동시 위와 같이 오류가 난다는 것 입니다. 에러 내용은 , 먼저 socket() 을 통해 fd 값을 얻고, 이것으로 connect() 를 하려면, 오류가 -1 이 리턴. WSAGetLastError() 를 통해 얻어 오는 것이 5 로서, ERROR_ACCESSS_DENIED 에 해당 하는 값 입니다. 과연 이 문제가 왜 발생 하는지 몇일 동안 고민 하고 있습니다. DLL 로 만들어서 call 하더라도 동일하게 문제가 발생 하는 것을 보아, 이것이 단순 socket 문제는 아닌 것 같고, 그렇다고 Administr..
리눅스용 비동기 소켓 서버 (Async Socket Server) 소스 이 소스는 소켓 서버를 돌리기 위해 만든 소스 입니다만, 최초 제가 구한 것도 인터넷이고 (원래 만든 분이 누군지 모르겠습니다) 잘 주워다 지금 쓰고 있느라, GPL 에 따라 소스를 공개 합니다. 혹시 이 소스의 원작자가 되시는 분이 이 소스에 대해 권리를 주장하신다면, 내리도록 하겠습니다 ^^ 소스의 다운로드: 필요 사항: 이 소스를 컴파일 하기 위해서는 POSIX 를 준수하는 컴파일러가 필요하며, Cygwin 에 있는 gcc 나 (minGW 는 불가), 리눅스 자체의 gcc 에서 컴파일이 가능 합니다. 사용 예제: 이 소스는 현재 AsyncSock 과 SocketWrap 이라는 부분으로 나뉘어져 있습니다. SocketWrap 이라는 부분이 Sock 을 Class 로 좀 더 쓰기 편하게 만들어 져 있고..
socket 의 recv() 는 항상 원하는 크기대로 오지 않는다 ! 이전의 버퍼를 다 받아 오지 않던 문제를 ... 그간 PC 에서 socket processing 하던 편리함에 빠져 그 근본을 잊었던 것 같습니다. 임베디드 보드가 지속적인 메모리의 malloc() 과 free() 때문인지 죽어 버리는 문제가 발생 하지만, 적어도 30MB 의 데이터를 지속적으로 500번 가량 전송 하는데 성공을 했습니다. 이유는 간단히, recv() 함수가 가진 특성을 그간 간과 했기 때문 입니다. socket 에서 recv() 로 원하는 크기가 다 넘어 오지 않는다. 이 사실을 제가 간과 하고 있었네요. 너무나 기초적인 부분인데, 어찌 이런걸 제가 그간 잊고 있었을까요? 그래서 코드를 다음과 같이 수정 하였습니다. int nRecvSize = 0; bool bRecvDone = fal..
임베디드 리눅스의 이 난감한 상황은 ... 시그윈에서 socket 과 inet 만으로 단순 socket server 를 만들었습니다. class 로 wrapping 해서 쓰기 편하게 만들어서 돌렸더만 잘 돌기에 힘들게 porting 한 embedded linux 에 넣고 짠! 하고 잘 돌줄 알았더니, 흠 - 얘가 뭔가 뾰로퉁 하게 도네요 .. 30MB 짜리 버퍼를 보내는데 4KB 보내고 멎어 있습니다. socket server 를 non-blocking, async 로 설계한 이유는 아닌거 같은데, FD_ISSET() 이나 ioctl() 에서 멎는 문제도 아닐텐데, 그 이유를 찾기가 어려운 난감한 상황이 아닌가 합니다. 현재 GbE 로 연결된 상태라 전체 속도의 반인 60MBytes/sec 정도가 나와 주면 좋겠는데, 설계의 문제인지 아니면 제가..