一.TCP協議
傳輸控制協議(TCP,Transmission Control Protocol)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。
TCP通過校驗和、序列號、確認應答、重發控制、連接管理以及窗口控制等機制實現可靠性傳輸。
udp -無連接(可不確認進行直接發送)
tcp -面向連接(必須經過雙方確認)
2.TCP協議創建過程
1)創建socket
2)綁定端口
3)監聽(轉給另外一個socket)
4)接受連接
5)收發數據
3.代碼實例—TCP通信,服務器可以接受客戶端發來的信息
服務器:
//1.創建TCP socket
SOCKET sockServer = socket(AF_INET,
SOCK_STREAM,
IPPROTO_TCP
);
//2.綁定端口
sockaddr_in siServer;
siServer.sin_family = AF_INET;
siServer.sin_port = htons(8888);
siServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int nRet = bind(sockServer, (sockaddr*)&siServer, sizeof(siServer));
if (nRet == SOCKET_ERROR)
{
printf("端口綁定失敗\n");
return 0;
}
//3.監聽
nRet = listen(sockServer, SOMAXCONN);//監聽最大值
if (nRet == SOCKET_ERROR)
{
printf("監聽失敗\n");
return 0;
}
//4.接受連接
while (true)
{
// 4) 接受連接
sockaddr_in siClient;
int nSize = sizeof(siClient);
SOCKET sockClient = accept(sockServer, (sockaddr*)&siClient, &nSize);
if (sockClient == SOCKET_ERROR)
{
printf("接受連接失敗 \r\n");
return 0;
}
printf("IP:%s port:%d 連接到服務器. \r\n",
inet_ntoa(siClient.sin_addr),
ntohs(siClient.sin_port));
HANDLE hTread = CreateThread(NULL, 0, HandleClientThread, (LPVOID)sockClient, 0, NULL);//用來收發數據的線程
CloseHandle(hTread);
}
//5.創建一個線程用來收發數據
DWORD WINAPI HandleClientThread(LPVOID pParam)
{
SOCKET sockClient = (SOCKET)pParam;
while (TRUE)
{
//5) 收發數據
char aryBuff[MAXWORD] = { 0 };
int nRet = recv(sockClient, aryBuff, sizeof(aryBuff), 0);
if (nRet == 0 || nRet == SOCKET_ERROR)
{
printf("接受數據失敗 \r\n");
return 0;
}
printf("收到數據: %s \r\n", aryBuff);
char szBuff[] = { "recv OK \r\n" };
nRet = send(sockClient, szBuff, sizeof(szBuff), 0);
if (nRet == SOCKET_ERROR)
{
printf("數據發送失敗 \r\n");
return 0;
}
}
return 0;
}
客戶端:
//1.創建TCP socket
SOCKET sockClient = socket(AF_INET,
SOCK_STREAM,
IPPROTO_TCP
);
//2.連接服務器
sockaddr_in siServer;
siServer.sin_family = AF_INET;
siServer.sin_port = htons(8888);
siServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int nRet = connect(sockClient, (sockaddr*)&siServer, sizeof(siServer));
if (nRet == SOCKET_ERROR)
{
printf("服務器連接失敗");
}
//3.收發數據
while (TRUE)
{
char szBuff[MAXWORD] = { 0 };
cin >> szBuff;
nRet = send(sockClient, szBuff, sizeof(szBuff), 0);
if (nRet == SOCKET_ERROR)
{
printf("數據發送失敗 \r\n");
return 0;
}
char aryBuff[MAXWORD] = { 0 };
nRet = recv(sockClient, aryBuff, sizeof(aryBuff), 0);
if (nRet == 0 || nRet == SOCKET_ERROR)
{
printf("接受數據失敗 \r\n");
return 0;
}
printf("收到數據: %s \r\n", aryBuff);
}
closesocket(sockClient);
return 0;
