C++Socket編程—TCP通信


一.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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM