socket实现UDP通信

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;
}

运行结果如下:




版权声明:本文为sunny1996原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。