::주인장  ::리눅스  ::프로그래밍  ::자유게시판 
::로그인     ::회원가입

 프로그래밍
::C,C++   ::소스   ::만든 프로그램  
C++ 과 C# 의 소켓 통신에 관해
C++ 과 C# 의 소켓 통신에 관해
겁나느린사람   좋아! 1   별로.. 0   2020-11-17 10:10:22
안녕하세요. 명월입니다.



이 글은 C++과 C#의 소켓 통신을 하는 방법(문자열 송수신)에 대한 글입니다.



이전에 C++의 소켓 통신과 C#의 소켓 통신에 대해 설명한 적이 있습니다.

링크 - [C#] 소켓 통신 - 1

링크 - [C++] 소켓(Socket) 통신을 하는 방법



제가 개발 일을 시작하기 시작한 10년 전쯤에는 C++의 프로그램도 많았고 프로젝트도 꽤 많았습니다. 최근에는 C++은 거의 없고, 보통은 Java나 C#이 대세이긴 합니다.

그 당시에 제가 기존의 C++서버가 있고 C# 클라이언트 프로그램을 만들어서 통신 할 때, 서로 통신이 제대로 되지 않아서 중간에 포기했던 적이 있습니다. 그 때는 선배들이 소켓 통신 할 때 같은 프로그램 언어가 아니면 통신이 제대로 되지 않는다고 선배들한테 혼났던 기억이 나네요.

그때도 생각하면 통신 소켓 자체가 통신 표준인데 프로그램 언어가 다르다는 이유로 왜 통신이 되지 않을까 생각한 적이 있었습니다만, 이런 저런 시간에 쫓겨 조사도 못하고 그냥 그렇구나 하고 넘어갔네요.. 근데 지금 생각하면 참 말도 안되는 이야기이고 우스운 이야기이지만 그랬던 적이 있습니다.



위 프로그램 언어가 다르면 소켓 통신이 되지 않는다라는 건 반은 맞고 반은 틀린 말입니다.

정확히는 프로그램 언어가 다른 이유가 아니고 소켓이 취급하는 자료형이 다른 것입니다.



C#은 기본적으로 소켓을 전송할 때, byte단위이고 문자열 자체가 Unicode로 되어 있습니다.

C++은 소켓이 char 단위이고 문자열이 const char*로 아스키 코드로 움직입니다. 이것을 맞추어야 합니다. 우리가 문자열을 한글을 사용하기 때문에 Unicode로 C++를 맞추어야 합니다.

C++에서 유니코드를 사용하려면 const char* 타입이 아닌 const wchar_t* 타입으로 사용해야 합니다.

그럼 먼저 이전에 작성했던 소켓 프로그램에서 타입을 바뀌겠습니다.



출처: https://nowonbun.tistory.com/737 [명월 일지]

  좋아!   별로..
버퍼사이즈는 최소 4 이상으로 하는게 좋은듯..  
  겁나느린사람   좋아! 0   별로.. 0   2020-11-17 19:09
wchar_t 는 크로스 플랫폼에서 사용을 주의 해야 하는게
윈도우에서 wchar_t 는 2바이트 인데
리눅스에서 wchar_t 는 4바이트 임.

물론 리눅스 컴파일 옵션에서 short 를 줘서 바이트를 맞출수도 있지만
그로인해 다른문제가 파생될 가능성도 있으므로..

char 에서 해결하고 문자셋은 변환 함수 등을 사용하는게 좋은듯..
 
  겁나느린사람   좋아! 0   별로.. 0   2020-11-17 23:53
코딩 부분에서 socket()함수에 프로토콜 패밀리에 AF_INET를 넣어도 되지만 PF_INET를 넣는게 바람직하고
struct sockaddr_in 구조체에 주소 체계를 넣을 때에도 PF_INET 를 넣어도 되지만 AF_INET를 넣는게 바람직하다.

출처: https://blishk.tistory.com/8 [無재미 잉여 블로그]  
  겁나느린사람   좋아! 0   별로.. 0   2020-11-20 00:27
 C 에서 mysql 사용에 관해
 게시물이 없습니다.