UDP與TCP不同,是一種無連接的通信方式,相比TCP而言更加靈活。
利用socket實現UDP的方式相比TCP而言也更加簡單。
發送方:
1.初始化套接字
2.創建socket
3.利用sendto發送數據(TCP是send)
4.關閉socket
接收方:
1.初始化套接字
2.創建socket並與本機進行綁定
3.利用recvfrom接收數據
4.關閉socket
有以下兩個函數是UDP通信獨有的
1.int sendto(SOCKET 發送的套接字,char* 發送的字符串,int 緩衝區長度,int 函數調用方式一般爲0,sockaddr* 目標地址結構體指針,int 地址長度)
sendto是UDP專門的數據發送方式,send()用於TCP SOCK_STREAM,sendto()用於UDP SOCK_DGRAM,返回發送字節的數目,失敗返回SOCKET_ERROR
2.int recvfrom(SOCKET 接收的socket,char* 接收的字符串,int 緩衝區長度,int 函數調用方式一般爲0,sockaddr* 源地址結構體指針,int 地址長度)
UDP發送方程序:
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <string>
#include <iostream>
#pragma comment(lib,"WS2_32.lib")
int main()
{
int retval;
std::string str;
char buf[20];
WSADATA wsa;
SOCKET s;
sockaddr_in addr_in;
WSAStartup(MAKEWORD(2, 2), &wsa);
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(9000);
printf("input an ip address: \n");
scanf("%s", buf);
addr_in.sin_addr.S_un.S_addr = inet_addr(buf);
getchar();
while (1)
{
printf("input the content:\n");
memset(buf, 0, sizeof(buf));
std::getline(std::cin, str);
strcpy(buf, str.c_str());
retval = sendto(s, buf, sizeof(buf), 0, (sockaddr*)&addr_in, sizeof(addr_in));
if (retval == SOCKET_ERROR)
{
printf("send failed\n");
closesocket(s);
WSACleanup();
return -1;
}
printf("send succeeded\n\n");
}
closesocket(s);
WSACleanup();
return 0;
}
接收方程序:
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")
int main()
{
char buf[20];
sockaddr_in addr_in;
SOCKET s;
WSADATA wsa;
int len;
WSAStartup(MAKEWORD(2, 2), &wsa);
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(9000);
addr_in.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(s, (sockaddr*)&addr_in, sizeof(addr_in));
len = sizeof(addr_in);
while (1)
{
memset(buf, 0, sizeof(buf));
recvfrom(s, buf, sizeof(buf), 0, (sockaddr*)&addr_in, &len);
printf("from: %s\n", inet_ntoa(addr_in.sin_addr));
printf("content: %s\n", buf);
}
closesocket(s);
WSACleanup();
return 0;
}
運行結果如下: