I have an MFC server which is listening on a port all the time. Now my requirement is to send data over the socket(using TCP/IP) to this server from a client written in python 3.6.
The python client sends the bytes, but once I receive data at the server end, the exception is thrown "Attempted to access an unnamed file past its end."
//Server code snippet
//Client codeCode:void CClientSocket::ReceiveMsg(CMsg* pMsg) { pMsg->Serialize(*m_pArchiveIn); } void CMsg::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar << (WORD)bClose; ar << m_strText; } else { WORD wd; ar >> wd; bClose = (BOOL)wd; ar >> m_strText; } m_msgList.Serialize(ar); }
I am not much aware of how to MFC sockets are working with CArchive and what exactly happens in there. Also, if I send message from C++ client, it works fine. Any help on how to send data from python to MFC C++ server which is compatible so that receive is successful is what I want know. Your help appreciated.Code:''' Simple socket client ''' import socket import sys def testme(): PlayerHost = "127.0.0.1" PlayerPort = 501 try: print ("Connecting --- to server" + PlayerHost) playerSoc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) playerSoc.connect((PlayerHost,PlayerPort)) except e: print ("Connectiong error") print(e) try: dataSendCommand = '$Command Command 0 100'; print ('---Before encode Command' + dataSendCommand); #print ('After encode command' + dataSendCommand.encode()); nbytes = playerSoc.send(dataSendCommand); print(nbytes); playerSoc.close(); except e: print ("Some issue") testme() exit(0)
I have the following in MFC C++ which I want to replicate in python but I am not sure on the datatype to be used.
Can anyone help me with the datatype ?Code:USES_CONVERSION; char buf[1024]; int nBufLen1; CString sendBuffer("$MyCommand Hi"); //int nBufLen1 = sendBuffer.GetLength(); buf[0] = 0; buf[1] = 0; WORD len = sendBuffer.GetLength() * 2; nBufLen1 = len + 5; // length of message buf[2] = (BYTE)len; char *pStr = T2A(sendBuffer); strncpy(&buf[3],pStr,len); // actual string to send buf[len + 3] = 0; buf[len + 4] = 0; if(sock.Send (&buf,nBufLen1) != nBufLen1) { OutputDebugString(L"Socket Send Failed"); return FALSE; }
Since I am new to python here is what i tried
I received error "descriptor 'encode' requires a 'str' object but received a 'list'"Code:bufArr2 = ["0" , "0" , "26" , "$MyCommand Hi" , "0" , "0"] print(bufArr2[3]); nbytes = playerSoc.send(bufArr2.encode()); //Error
Not sure on how to send the list as bytes. Also, not sure if there is something else that I can use instead of list.
Megha


Reply With Quote
Victor Nijegorodov
