关于socket UDP传输实现

写个关于socket UDP传输的帖子,在网上找到的材料,拼凑在一起,运行在Windows VS2017中,服务器端模拟只发送的情况,具体的代码如下:

需要注意的地方:
1.收发两端可以用不同名字的socket,但收发两端要定义相同的数据结构来进行接收和发送;
2.sendto 函数和recvfrom函数在最后一个参数使用略有不同;”
3.在只编好了一端程序想进行程序输出检查时,可借助于wireshark,抓UDP包进行分析,注意数据包中数据的长度,wireshark中右侧是16进制的数,表示的是ASCII码,左侧是发送的内容,如图所示,发送的是hello world!。
wireshark

发送端运行在Windows VS2017中:
发送端的逻辑:创建socket-绑定socket-发送socket

#include <stdio.h>
#include <WinSock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#define _WINSOCK_DEPRECATED_NO_WARNINGS

int main(int argc, char* argv)
{
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA data;
	if (WSAStartup(sockVersion, &data) != 0)
	{
		return 0;
	}
	
	SOCKET sclient = socket(AF_INET, SOCK_DGRAM, 0); //创建socket
	if (sclient == INVALID_SOCKET)
	{
		printf("invalid socket!");
		return 0;
	}

	struct sockaddr_in serAddr;
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(9527);
	serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.100");    //发送端地址

	struct sockaddr_in cliAddr;
	cliAddr.sin_family = AF_INET;
	cliAddr.sin_port = htons(9527);
	cliAddr.sin_addr.S_un.S_addr = inet_addr("192.169.230.1");   //接收端地址

	int BIND = bind(sclient, (struct sockaddr *)&serAddr, sizeof(serAddr));//绑定socket
	if (BIND == SOCKET_ERROR)
	{
		printf("bind error!\n");
		return 0;
	}

	while (1)
	{
		char SENDDATA[] = "HELLO WORLD! \n";
		char * sendData = SENDDATA;
		int SEND = sendto(sclient, sendData, sizeof(sendData), 0, (struct sockaddr*)&cliAddr, sizeof(cliAddr));  //发送socket
		if (SEND == -1)
		{
			printf("send error!\n");
			return 0;
		}
		

	}

	closesocket(sclient);
	WSACleanup();
	return 0;

}

接收端运行在Windows VS2017中:
接收端的逻辑:创建socket-绑定socket-接收socket

#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#define _WINSOCK_DEPRECATED_NO_WARNINGS

int main(int argc, char* argr[])
{
	//初始化WSA
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA wsaData;
	if (WSAStartup(sockVersion, &wsaData) != 0)
	{
		return 0;
	}


	//创建套接字
	SOCKET revsocket = socket(AF_INET, SOCK_DGRAM, 0);
	if (revsocket == INVALID_SOCKET)
	{
		printf("socket error!");
		return 0;
	}

	//绑定IP
	struct sockaddr_in dest;
	dest.sin_family = AF_INET;
	dest.sin_port = htons(9257);
	dest.sin_addr.S_un.S_addr = inet_addr("192.168.0.100");  //接收端的IP

	struct sockaddr_in source;
	source.sin_family = AF_INET;
	source.sin_port = htons(9257);
	source.sin_addr.S_un.S_addr = inet_addr("192.168.0.106");  //发送端的IP



	int BIND = bind(revsocket, (struct sockaddr *)&dest, sizeof(dest));
	if (BIND == SOCKET_ERROR)
	{
		printf("bind error!");
	}

	char revData[30];

	while (1)
	{
		int rev;
		int sourcelength = sizeof(source);
		rev = recvfrom(revsocket, revData, sizeof(revData), 0, (struct sockaddr *)&source, &sourcelength);  //接收socket

		//printf("%d\n", sizeof(revData));
		
		if (rev > 0)
		{
		    printf("%s\n",revData);		
		}
		else
		{
			printf("revcive error!\n");
		}
	
	}
	closesocket(revsocket);
	WSACleanup();
	return 0;
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值