UDP网络应用程序编写和套接字及相关定义

主要步骤:

1.加载套接字库

2.创建套接字

3.绑定套接字(与端口绑定)

4.发送或等待接收数据

5.关闭套接字

注意:

如果要同时进行收发操作时,收的时候可以按照默认的套接字使用(即接收任意IP发送的数据),但是发送时要注意,如果是发送给指定的IP,需要重新创建套接字的对象,并把指定IP进行赋值,其具体如下:

SOCKET sock0 = socket(AF_INET,SOCK_DGRAM,0)  //如果已经创建了,就可以不要这句,直接拿创建的就行,下面为需要

                                                                                  //修改的部分

SOCKADDR_IN addrNew;                                          //此处对象名字可以随便改

addrNew.sin_addr.S_un.S_addr = inet_addr("192.168.0.10");   //这里输入该IP地址

addrNew.sin_family = AF_INET;                                     //这里是地址族

addrNew.sin_port = htons(6000);                                  //这里是端口号

如果绑定了就不用再绑定了

此外接收数据时,发送方的IP地址会存储在addrNew.sin_addr中,可以用以下的语句,将其转换为string类型

string ip = inet_ntoa(addrNew.sin_addr);

UDP的服务端

#include <Winsock2.h>
#include <iostream>
#include <stdio.h>
using namespace std;

void main()
{
	//加载套接字库
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD ( 1, 1);

	err = WSAStartup( wVersionRequested, &wsaData);
	if( err != 0 )
	{
		return;
	}

	if( LOBYTE( wsaData.wVersion ) != 1 ||
		HIBYTE( wsaData.wVersion ) != 1)
	{
		WSACleanup();
		return;
	}
	//创建用于监听的套接字
	SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);		//TCP 第二个参数用SOCK_STREAM

	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);	
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	//绑定套接字
	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

	//等待并接受数据
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);
	char recvBuf[100];

	recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
	cout<<recvBuf<<endl;
		
	//关闭套接字
	closesocket(sockSrv);
	WSACleanup();
	getchar();
}

UDP的客户端

#include <Winsock2.h>
#include <stdio.h>

void main()
{
	//加载套接字库
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD ( 1, 1);

	err = WSAStartup( wVersionRequested, &wsaData);
	if( err != 0 )
	{
		return;
	}

	if( LOBYTE( wsaData.wVersion ) != 1 ||
		HIBYTE( wsaData.wVersion ) != 1)
	{
		WSACleanup();
		return;
	}
	//创建套接字
	SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);

	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.0.102");
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	//发送数据
	sendto(sockClient,"Hello",strlen("Hello")+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	//关闭套接字
	closesocket(sockClient);
	WSACleanup();
}

猜你喜欢

转载自blog.csdn.net/qq_37358422/article/details/81251692