레이블이 연동인 게시물을 표시합니다. 모든 게시물 표시
레이블이 연동인 게시물을 표시합니다. 모든 게시물 표시

C와 Python 소켓 데이터 연동

C와 Python 소켓 데이터 연동

C에서 소켓으로 스트럭쳐 데이터를 send하고
Python에서 소켓으로 데이터를 받아 스트럭쳐의 밸류값을 recv, 다시 데이터를 send하는 에코 서버 로직을 구현해 보았다.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# Python server simulator
# 133 사이즈의 데이터를 소켓으로 recv하고 받았던 곳으로 다시 준다.

# struct.unpack시에 '='인자를 포함함으로써 padding byte를 제거 하고 C에서
# "#pragma pack(1)"과 같은 역할을 하게 한다.

dataFormat = '='         

dataFormat += '20s'  # 스트링 20 byte
dataFormat += '4s'
dataFormat += '2s'
dataFormat += '2s'
dataFormat += '10s'
dataFormat += 'c'      # char 1byte
dataFormat += '2s'
dataFormat += '38s'
dataFormat += 'c'
dataFormat += 'c'
dataFormat += '2s'
dataFormat += '2s'
dataFormat += '9s'
dataFormat += '8s'
dataFormat += '8s'
dataFormat += '6s'
dataFormat += '6s'
dataFormat += '7s'
dataFormat += '4s'

stNiceCardInfoReq = struct.Struct( dataFormat )
# 스트럭쳐 구조에 대한 정의를 Struct() 매개변수로 돌려준다
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8888))
sock.listen(5)
while 1:
    cli_sock, addr = sock.accept()
    recvData = cli_sock.recv(133)

    for str in data:
        print str
    rst = cli_sock.send(recvData[:133])
    print "send(%d)"%rst

sock.close()

# 받은 데이터 133 사이즈 패킷을 dataFormat 형식으로 마샬링(분리)한다.
data = stNiceCardInfoReq.unpack(recvData)