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;
}
运行结果如下:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)