服務端初始化 Socket、綁定地址、啟動監聽線程;通用 Send/Receive 封裝處理 TCP 流式特性導致的發送/接收不完全問題。
void CServerDlg::OnStart()
{
sockaddr_in local = { AF_INET, htons(2000), INADDR_ANY };
m_Listening = socket(AF_INET, SOCK_STREAM, 0);
if (m_Listening == INVALID_SOCKET) return;
if (bind(m_Listening, (sockaddr*)&local, sizeof(local)) == SOCKET_ERROR)
{
closesocket(m_Listening); return;
}
DWORD threadId;
m_hListenThread = CreateThread(NULL, 0, ListenThread, this, 0, &threadId);
// UI 按鈕狀態切換...
}
int Receive(SOCKET fd, char* buf, int len)
{
int cnt = len, rc;
while (cnt > 0)
{
rc = recv(fd, buf, cnt, 0);
if (rc == SOCKET_ERROR) return -1;
if (rc == 0) return len - cnt; // 對端關閉
buf += rc; cnt -= rc;
}
return len;
}
int Send(SOCKET fd, char* buf, int len)
{
int cnt = len, rc;
while (cnt > 0)
{
rc = send(fd, buf, cnt, 0);
if (rc == SOCKET_ERROR) return -1;
if (rc == 0) return len - cnt;
buf += rc; cnt -= rc;
}
return len;
}
bind 使用 INADDR_ANY 綁定所有網卡,htons 確保端口網絡字節序。Send/Receive 循環讀寫,解決「粘包/拆包」導致的單次調用不完全問題。