C++Socket編程—UDP通信


一.socket編程-套接字編程——UDP通信

    UDP,用戶數據報協議(UDP,User Datagram Protocol),UDP是面向無連接協議,面向無連接的意思是只有“傳送數據”的過程,提供面向事務的簡單不可靠信息傳送服務。
    即使是在網絡擁堵的過程中,UDP也無法進行流量控制等避免網絡擁塞,傳輸過程種丟包,UDP也不負責重發,甚至出現包的到達順序亂掉的情況也無法糾正。
    UDP往往可以用於以下情況:
    • 包總量較少的通信(DNS,SNMP)
    • 視頻,音頻多媒體通信(即時通訊)
    • 廣播通信

UDP編程模型:

 

 

 

 

 二、UDP編程步驟:

1.初始化WASD

2.創建socket,指明使用的協議

3.收發數據

 

三、代碼示例——使用UDP進行通信:

發數據端:

	//初始化
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD(2, 2);
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0) {
		return 1;
	}

	if (LOBYTE(wsaData.wVersion) != 2 ||
		HIBYTE(wsaData.wVersion) != 2) {
		WSACleanup();
		return 1;
	}

	//1. 創建socket, 指明要使用的協議什么
	SOCKET sock = socket(
		AF_INET,	//ipv4協議族
		SOCK_DGRAM, //數據報
		IPPROTO_UDP);//udp協議
	if (sock == INVALID_SOCKET)
	{
		printf("創建socket失敗 \r\n");
		return 0;
	}


	//3. 發數據
	sockaddr_in siTo;
	siTo.sin_family = AF_INET;
	siTo.sin_port = htons(9527);
	siTo.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	char szBuff[0x1000] = {"hello socket" };
	int nBytesSend = sendto(sock,
		szBuff,
		sizeof(szBuff),
		0,
		(sockaddr*)&siTo, //客戶端的的目標地址和端口
		sizeof(siTo));

	if (nBytesSend == SOCKET_ERROR)
	{
		closesocket(sock);
		printf("接受數據失敗 \r\n");
		return 0;
	}


	//接收數據
	sockaddr_in siRecv;
	int nSizeOfSiRecv = sizeof(siRecv);
	char szBuff0[MAXWORD + 1] = { 0 };
	int nBytesRecv = recvfrom(sock,
		szBuff0,
		sizeof(szBuff0),
		0,
		(sockaddr*)&siRecv,
		&nSizeOfSiRecv);
	if (nBytesRecv == SOCKET_ERROR)
	{
		closesocket(sock);
		printf("接受數據失敗 \r\n");
		return 0;
	}


	//清理
	WSACleanup();

return 0;

 

 收數據端:

//初始化
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
	return 1;
}

if (LOBYTE(wsaData.wVersion) != 2 ||
	HIBYTE(wsaData.wVersion) != 2) {
	WSACleanup();
	return 1;
}

//1. 創建socket, 指明要使用的協議什么
SOCKET sock = socket(
	AF_INET,	//ipv4協議族
	SOCK_DGRAM, //數據報
	IPPROTO_UDP);//udp協議

if (sock == INVALID_SOCKET)
{
	printf("創建socket失敗 \r\n");
	return 0;
}

//2.綁定端口,指明本進程端口是什么
sockaddr_in si;
si.sin_family = AF_INET;
si.sin_port = htons(9527);//0x3725;

si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//0x0100007f; //127.0.0.1

int nRet = bind(sock, (sockaddr*)&si, sizeof(si));
if (nRet == SOCKET_ERROR)
{
	printf("端口綁定失敗\r\n");
	closesocket(sock);
	return 0;
}
//3.收數據
	sockaddr_in siRecv;
	int nSizeOfSiRecv = sizeof(siRecv);

	char szBuff[MAXWORD] = { 0 };
	int nBytesRecv = recvfrom(sock,
		szBuff,
		sizeof(szBuff),
		0,
		(sockaddr*)&siRecv,
		&nSizeOfSiRecv
	);

	if (nBytesRecv == SOCKET_ERROR)
	{
		closesocket(sock);
		printf("接受數據失敗\r\n");
	}


	//清理
WSACleanup();

 


免責聲明!

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



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