朋友公司手游服務端用 DIOCP3 做文件服務器,客戶端 Cocos2d-x 對接屢試失敗。本文記錄在 Windows Code::Blocks + MinGW 環境下,從編譯鏈接配置、協議編碼實現到成功通信的完整排查過程。
服務端要求封包格式:
[Flag(1B)] [CheckValue(1B)] [DataLen(2B,網絡序)] [Data(NB)]
// 發送封包
void send_packet(SOCKET s, const char *data, int len) {
char buf[1024];
buf[0] = 0xAA; // Flag
buf[1] = 0xAA ^ (len & 0xFF) ^ (len >> 8); // CheckValue
*(unsigned short*)(buf+2) = htons(len); // DataLen (大端)
memcpy(buf+4, data, len); // Data
send(s, buf, len+4, 0);
}
// 接收並驗證
int recv_packet(SOCKET s, char *out, int maxlen) {
char hdr[4];
if (recv(s, hdr, 4, MSG_WAITALL) != 4) return -1;
if (hdr[0] != 0xAA) return -2;
int len = ntohs(*(unsigned short*)(hdr+2));
if (len > maxlen) return -3;
if (recv(s, out, len, MSG_WAITALL) != len) return -4;
// 可選:驗證 CheckValue
return len;
}
客戶端發送編碼封包 → 服務端解碼 → 原樣編碼返回 → 客戶端解碼打印,實現雙向通信閉環。