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)

댓글 없음:

댓글 쓰기