목록전체 글 (23)
layered
5-1 에코 클라이언트의 완벽 구현! TCP는 전송되는 데이터의 경계가 없다. 스트림을 구성해서 전달하기 때문이다. 따라서 한 번의 send로 데이터를 보낼 때 내부적으로는 여러 개의 패킷으로 쪼개서 전달할 수도 있고, 이는 recv를 통해서 받을 때에도 마찬가지이다. 예를 들면 [안녕하세요!]를 보냈는데 실제로는 [안] [녕하] [세요!]로 쪼개서 보낼 수도 있다는 것이다. 이런 특성으로 인해 아직 수신 버퍼에 원하는 만큼의 데이터가 쌓이지 않았는데 그대로 읽어 버릴 수도 있기 때문에, 반복문을 돌려서 보낸 데이터의 길만큼 받도록 해야 한다. 다음과 같이 코드를 수정할 수 있다. int send_len = send(serv_sock, message, strlen(message), 0); // 보낸 데이..
Server.c #define _WINSOCK_DEPRECATED_NO_WARNINGS #include #include #include ; #include #include #define BUF_SIZE 1024 #pragma comment(lib, "Ws2_32.lib") void error_handling(const char*); int main() { WSADATA wsadata; if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) error_handling("WSAStartup() error!"); SOCKET serv_sock, clnt_sock; struct sockaddr_in serv_addr, clnt_addr; char message[BUF_SIZE + 1..
4-2 TCP 기반 서버, 클라이언트 구현 TCP 서버의 기본적인 함수 호출 순서 리눅스에서는 send/recv 대신 read/write를 사용하기도 한다. 윈도우에서는 send/recv만 사용할 수 있다. 윈도우에서 소켓은 closesocket()으로 닫는다. 메모 리눅스에서만 read/write는 파일을 다룰 때에도 사용하지만 send/recv는 소켓에서만 사용할 수 있다(대신 여러 옵션을 부여할 수 있다는 장점이 있다). 리눅스에서만 작동시키려면 read/write를 쓰고, 윈도우와의 호환성을 고려한다면 send/recv를 쓰는 것이 좋은 것 같다. 연결요청 대기상태로의 진입 소켓에 주소를 할당했다면, 이제 연결을 해도 된다고 알려야 한다. 즉, 소켓을 LISTENING 상태로 만드는 것이다. in..