MATLAB에서 C처럼 이벤트 방식의 고급소켓통신하기는 힘들다.
제공하는 tcpip 라이브러리도 매우 기초적인 수준이기 때문에 많은것을 기대 해선 안된다.
그래서 보통 기본만 하는 소켓통신을 하게 되는데
소켓통신라이브러리는 pnet이라는것을 다운 받아 사용하는것을 추천한다.
http://www.mathworks.com/matlabcentral/fileexchange/345-tcpudpip-toolbox-2-0-6
비동기방식의 서버 구현을 matlab에서 하기는 상당히 에로사항이 있는것 같다. 여기서는 Client 부분만 소개한다.
1) socket connect
ip = '127.0.0.1';
port =9999;
>> socket = pnet('tcpconnect',ip,port)
만들어진 socket id를 리턴한다.. -1이면 접속실패
2) send
a. 1byte char 전송
>>str = 'abcde'; %matlab에서는 캐릭터 하나가 1 바이트가 아니다. 따라서 1byte 로 변환을 해준다.
>>strdata = uint8(str); % 1바이트 비트 어레이로 변환하고 이것을 소켓을 통해 날리면 된다.
>>pnet(socket,'write',strdata,'uint8') %1바이트 비트어레이로 전송
b. 4byte Integer 전송
% matlab에서 정수를 그냥 쓰면 보통 8 바이트 double타입이다. 이것을 4바이트 정수형으로 변환하고 다시 그것을 1바이트 비트 어레이로 만든다음에 소켓으로 던진다.
>>intnum = 1;
>>intnumdata = uint32(intnum); %4바이트 정수형으로 변환
%만약 4바이트 인테져가 오버플로우 날 만큼 큰 수를 넣으면 당연히 uint32로 변환과정에서 data loss가 일어난다.
%즉 a= 9999 인데 b = uint8(a) 이러면 데이터가 손상된다는 말이다.
>>intnumdata = typecast(intnumdata,'uint8')% 4바이트 인테져를 1바이트 비트 어레이로 나열한다. typecast는 데이터 자체를 변환 시키는것이 아니라 type만 변환시킨다.
>>pnet(socket, 'write',intnumdata,'uint8') % 1바이트 비트 어레이 형태로 소켓을 통해 쏜다.
c. 4byte float 전송
4바이트 정수형과 마찬가지로 한다 .
>>f = 1.333333;
>>fd = single(f);
>>fd = typecast(fd, 'uint8')
>>pnet(socket, 'write',fd,'uint8')
이렇게 타입만 잘맞추어 보내면 server측이 뭘로 짜여져 있던 다 잘 받는다.
3)receive
recvMessage = pnet(socket,'read',9,'char');
이러면 9바이트 캐릭터를 받는다.
만약 13개의 4byte float 숫자를 받으려면
typesize = 4;
data = pnet(socket, 'read', 13*typesize ,'uint8')
이렇게 비트 어레이로 받고 이것을 float형태로 변환해준다.
f_data = typecast(data,'single')
어떤 형식의 데이터든지 비트 어레이로 받아서 타입 변환을 해주면 된다.
pnet은 receive time out을 설정해 줄수 있는데 receive time out을 길게 설정하면 blocking 방식의 소켓통신이 되고
0으로 설정하면 non-blocking 방식으로 작동한다. (사실 non-blocking은 아니고 흉내만 내는 수준인듯..)