Sunday, July 22, 2012

Sending file through UDP Socket

12 comments
Introduction
(THIS is a repost, original post can be found on DNX Group blog)
User Datagram Protocol or UDP is a simple protocol. This protocol is unreliable - when a data packet is sent, it cannot be not known if it will reach its destination or not. There is no acknowledgement, retransmission, or timeout. When multiple data is sent at once, the order which they arrive cannot be predicted. They might be out of order. The data that is sent with sequence 1,2,3 might be recieved as 2,3,1. So, sending files through UDP socket is a bit difficult.



Normally in a realtime game such as FPS, UDP protocol is used to send player location and behaviour. This data will be send continuously to provide a realtime player action to other player. But when the data is not arrived, the data will be skipped without retransmission so that the gameplay will be realtime, and not delayed. When sending files, a new protocol must be constructed as the file data must be sent completely. It cannot be skipped as it will corrupt the file.

About This Project
This is a simple project to demonstrate sending a file through UDP Socket. The code here might not perfect and may contains several flaws and bugs which might prevent the file from being sent perfectly.

Download Project file + Demo

UDP
To start this project, a simple UDP socket class must be constructed to assists sending and receiving data packet through UDP socket. This class will be named CSockUDP and will contain this method:
class CSockUDP
{
public:
 static int InitWinsock();
 static void DestroyWinsock();

 void SetCallback(cbDataRecieved fnRecieved);
 int CreateSocket(int nPort = 31313);

 void StartListen();
 void StopListen();

 bool SetServerAddress(char* szServer, int nPort);
 int SendData(LPVOID lpData, int nSize);
 int ResendData();
}

InitWinsock() and DestroyWinsock() is a call to WinsockAPI to initiates and stop the use of Winsock Dll. It must be called on very early when the program is started and on the very end before the program terminated.

A call to CreateSocket() will create a new UDP socket and assign it with a port number. Then, SetCallback() is called to set receive event function. StartListen() will create a new thread which will executes a loop code and listen for any incoming data. Other method is self explanation.

----

To send files through UDP socket, firstly a protocol must be constructed. Every data packet that is sent must have some sort of acknowledgement and identification so the receiver can understand what is it and what should it do. We can start by creating a data header followed by the data itself.

struct TUDPHeader
{
 char szID[3]; // 'IKH' - unique id
 DWORD dwCRC32; // Checksum of Data
 char type;  // eDataType
 int nLength; // Data length

 // Data (TUDPFileHeader/TUDPFileReply/TUDPFileTransfer)
};
Inside this header, szID is an identification. It will contain unique data, "IKH" in this case and send it to the receiver. When the receiver read the data and found that the first 3 bytes is equal to "IKH", it will continue read the packet but when it different, the packet will simply be skipped as it might come from other software that is also sending a data to the same port.

dwCRC32 will contain a data checksum (not including TUDPHeader). The sender will calculate the data checksum and fill dwCRC32 with it. When it arrives at destination, the receiver will calculate the data checksum again and compare it with dwCRC32. If the checksum calculated by receiver differ from what is sent by sender, it will indicates that the data is corrupted or altered before its reach its destination. If this happen, the receiver will request that the data must be sent back again.

type explains to the receiver what must it do with the data.

enum eDataType
{
 eDataTypeConnect,   // ping
 eDataTypeConnected,   // Reply if server got connect message
 eDataTypeResend,   // Corrupted data, request for resend
 eDataTypeQuit,    // Exit the program, client and server

 eDataTypeFileHeader,  // TUDPFileHeader
 eDataTypeFileTransfer,  // TUDPFileTransfer

 eDataTypeFileReplyAccept, // Accept the file send request
 eDataTypeFileReplyReject, // Denied the file send request
 eDataTypeFileReplyOK,  // Proceed to next stream
 eDataTypeFileReplyFinish // Finished transfer
};

Lastly inside this header (TUDPHeader), is nLengthnLength will tell how big is the data sent by sender. Without it, the receiver does not know when the data end.

----

When a file is being sent, a packet is constructed from TUDPHeader followed by TUDPFileHeader. It will send a file name followed by size of the file in bytes.

struct TUDPFileHeader
{
 char szFileName[128];
 int nFileSize;
};

After that, receiver will reply either to accept the file or reject it like we can see in eDataTypeeDataTypeFileReplyAccept/eDataTypeFileReplyReject. If the file is accepted, the receiver will create a new file and the sender will immediately send the file data using TUDPFileTransfer which contain file offset, data size and the file data itself.

struct TUDPFileTransfer
{
 int nFileOffset;
 int nLength;
 char szData[2048];
};

The receiver then writes the newly created file with the data its received in TUDPFileTransfer until the file completed.

Example of sending data packet with TUDPHeader + TUDPFileHeader

Artikel ini juga boleh didapati dalam Bahasa Melayu: Klik disini

12 comments :

  1. Popular Risk Options
    Sbobet It is a great way to win online games. Providing users in the mobile games. Because it can play online gambling. Use the service through the website or download the application, depending on the preferences. The risky game is that any time it is popular. Because it is a game that is exciting and challenging for your. Online casino games are a great way to keep you entertained. Every game is ready to serve the customer to your fingertips. BETTING BETS Real-time online betting that will make you feel like playing from a live casino. Opportunities of gambling that bring wealth to the user. Every game is designed to meet all your needs. Games to play online at any time. Ready to serve Speed From the team that serves all gamblers like professionals. Better to gamble at online casino games that customers please. It is also an alternative to many people who use the service. Since the bets are easy and the money is suddenly high, every bet. คาสิโน

    ReplyDelete
  2. สล็อต แตก ง่าย พนันออนไลน์ยอดนิยมยอดนิยมเยอะที่สุดในขณะนี้เนื่องด้วยเป็นเกมที่มีต้นแบบการเล่นที่ง่าย ไม่สลับซับซ้อน พีจีแตกต่างจากพนันอื่นๆที่มีข้อตกลง กรรมวิธีการเล่นที่ยุ่งยาก

    ReplyDelete
  3. super slot เว็บสล็อตออนไลน์ มาแรงชั้นที่ 1 เว็บไซต์ พนัน ออนไลน์ ฟรี เครดิต ของประเทศไทย ในปี 2022 ควรต้องยก ให้เว็บ pg ความรู้ความเข้าใจของคนไทย สร้างเอง ไม่ผ่านคนกลาง

    ReplyDelete
  4. ทดลอง เล่น สล็อต PG SLOT ทดลองเล่นฟรีไม่ต้องสมัครก็สามารถเล่นได้ไม่จำกัดวงเงินปั่นรัวๆได้ กับเว็บ สล็อตออนไลน์ PG-SLOT.GAME ที่นำเกมสล็อตจากค่าย PG SLOT มารวมไว้ในที่เดียว

    ReplyDelete
  5. โปรโมชั่น pg slot มากมาย เล่นง่ายจ่ายจริง แตกจริง ต้อง PG-สล็อต เท่านั้น! เล่นสล็อต พีจีสล็อต เว็บไซต์ตรงผู้ให้บริการเกมสล็อตออนไลน์ชั้นหนึ่ง ทกลอง เล่น ฟรี พร้อมโบนัส

    ReplyDelete