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