【Socket】Linux下UDP Socket的基本流程以及connect、bind函数的使用(C语言实现)

这篇具有很好参考价值的文章主要介绍了【Socket】Linux下UDP Socket的基本流程以及connect、bind函数的使用(C语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【Socket】Linux下UDP Socket中connect、bind函数的使用(C语言实现)


一、UDP Socket简介

Socket的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”。

Socket通信主要有两个类型:TCP、UDP。

TCP通信,是一个有序的、可靠的、面向连接的通信方式。用数据流的方式传递信息。
UDP通信,是无连接的、不保证有序到达的、但具有较好的实时性、能够高速传输的通信方式。用数据报的方式传递信息。

其中,UDP Socket主要使用场景为:实时性要求高,可以接受一定的数据错误和丢失。例如在线游戏、音视频聊天等场景。

UDP Socket对于客户端和服务端的区分不明显,在需要时,客户端和服务端均可以使用connect、bind函数。
因此,本文从对我个人来说更好理解的角度定义客户端和服务端,即以我方服务和对方服务来区分两端。

二、Linux下socket的基本流程

在此介绍Linux系统下UDP Socket通信的基本流程,使用C语言实现。(Windows系统下另需要其他步骤如WSAStartup,请自行查找)

1、头文件引用

#include <stdio.h>
#include <string.h>
#include <unistd.h> // 提供通用的文件、目录、程序及进程操作的函数,如close()
#include <sys/socket.h> // 提供socket主要函数
#include <arpa/inet.h> // 提供IP地址格式转换函数;包含了<netinet/in.h>,提供sockaddr_in数据结构
//#include <netdb.h> // 未使用,提供设置及获取域名的函数

2、宏定义部分

#define MY_PORT 2024 // 我方服务PORT
#define THEY_IP "192.168.0.88" // 对方服务IP
#define THEY_PORT 2023 // 对方服务PORT
#define SOCKET int // Linux下的socket()函数返回int类型,这里定义SOCKET方便理解

3、声明全局变量

SOCKET mySocket; // (我方)网络套接字
sockaddr_in mySockAddr; // 我方网络地址
sockaddr_in theySockAddr; // 对方网络地址

4、定义和配置Socket

bool init() {
	// 定义(我方)网络套接字
	mySocket = socket(AF_INET, SOCK_DGRAM, 0);

	// 定义我方物理地址配置
	mySockAddr.sin_family = AF_INET;
	mySockAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听本机所有地址
	mySockAddr.sin_port = htons(MY_PORT);

	// 定义对方物理地址配置
	theySockAddr.sin_family = AF_INET;
	theySockAddr.sin_addr.s_addr = inet_addr(THEY_IP);
	theySockAddr.sin_port = htons(THEY_PORT);

	return true;
}

5、connect和bind函数介绍

bind()函数一般在服务器端使用,表示绑定我方服务socket的IP和端口。

int bind(SOCKET socket, const struct sockaddr * addr, socklen_t len)
// socket套接字,addr我方物理地址,len我方物理地址长度

connect()函数一般在客户端使用,表示把我方服务socket连接至对方服务IP和端口,是面向连接的。主要作用在后续send与sendto函数的使用区别。使send更加方便,就不需要每次使用sendto指定目标服务了。

int connect(SOCKET socket, const struct sockaddr * addr, socklen_t len)
// socket套接字,addr对方物理地址,len对方物理地址长度

6、套接字绑定

绑定我方套接字和我方服务地址

int ret = bind(mySocket, (sockaddr*)&mySockAddr, sizeof(mySockAddr)); // ret返回0成功绑定

7、(可选)连接至对方服务

把我方套接字连接至对方服务地址,连接后向对方服务发送数据使用send函数,否则使用sendto函数

int ret = connect(mySocket, (sockaddr*)&theySockAddr, sizeof(theySockAddr)); 

8、收发数据

存储数组定义:

char recvBuf[512]; // 接收信息存储的数组地址
char sendBuf[512]; // 发送信息存储的数组地址
char tempBuf[512]; // 中间数据

接收数据:

sockaddr_in otherSockAddr; // 定义对方服务网络地址,这个地址不只表示第三节说的对方网络地址,也包括其他服务的地址,这里作为存储单元使用
socklen_t sockLen = sizeof(otherSockAddr);

int recvLen = recvfrom(mySocket, recvBuf, 512, 0, (sockaddr*)&otherSockAddr, &sockLen); // 返回接收数据长度,长度>0认为有数据

printf("From: %s:%d.\nMessage: %s\n", inet_ntoa(otherSockAddr.sin_addr), ntohs(otherSockAddr.sin_port), recvBuf); // 获得对方服务的ip/port

发送数据:

// 可以接收了谁的数据返回给谁,也可以固定一个目标服务,以前者为例
strcpy(sendBuf, "GOT IT!");
sendto(mySocket, sendBuf, 512, 0, (sockaddr*)&otherSockAddr, sockLen); // 通过我的套接字发送给对方服务

// connect时使用:仅发送给连接的对象
send(mySocket, sendBuf, 512, 0);

9、关闭套接字

close(mySocket);

10、完整的主函数

int main() {
	// 1、初始配置
	if (!init()) {
		printf("INIT ERROR!\n");
		return -1;
	}

	// 2、我方服务套接字绑定
	int ret = bind(mySocket, (sockaddr*)&mySockAddr, sizeof(mySockAddr));
	if (ret == 0) {
		printf("UDP SERVER IS START AND BIND TO %d.\n", MY_PORT);
	}
	else {
		printf("PORT %d BIND FAILED!\n", MY_PORT);
		return -1;
	}
	
	// (可选)连接至对方服务
	//int ret = connect(mySocket, (sockaddr*)&theySockAddr, sizeof(theySockAddr)); 
	
	// 3、定义存储地址
	char recvBuf[512]; // 接收信息存储的数组地址
	char sendBuf[512]; // 发送信息存储的数组地址
	char tempBuf[512]; // 中间数据

	// 4、定义接收到的其他服务地址
	sockaddr_in otherSockAddr;
	socklen_t sockLen = sizeof(otherSockAddr);
	
	// 持续收发
	while (true) {
		// 5、接收
		int recvLen = recvfrom(mySocket, recvBuf, 512, 0, (sockaddr*)&otherSockAddr, &sockLen); // 返回接收数据长度,长度>0认为有数据
		printf("From: %s:%d.\nMessage: %s\n", inet_ntoa(otherSockAddr.sin_addr), ntohs(otherSockAddr.sin_port), recvBuf); // 打印接收到的对方服务的ip/port
		if (!strcmp(recvBuf, "exit")) { // 接收到exit退出收发(这个方式退出不安全)
			printf("Exit success.\n");
			break;
		}
		
		// 6、发送
		strcpy(sendBuf, "GOT IT!");
		sendto(mySocket, sendBuf, 512, 0, (sockaddr*)&otherSockAddr, sockLen); 	
		// connect时使用:仅发送给连接的对象
		//send(mySocket, sendBuf, 512, 0);
	}

	// 7、关闭套接字
	close(mySocket);
	return 0;
}

(代码没有经过测试,相信各位都是成熟的程序员,会自己改bug(๑•̀ㅂ•́)و✧)文章来源地址https://www.toymoban.com/news/detail-646268.html

到了这里,关于【Socket】Linux下UDP Socket的基本流程以及connect、bind函数的使用(C语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Socket编程详解:从基本概念到实例应用(TCP|UDP C语言实例详解)

    简介: Socket编程是网络编程中至关重要的一部分,它提供了一种在不同主机之间进行数据通信的方式。本篇博客将详细介绍Socket编程的基本概念、原理和实例应用,帮助读者深入理解和掌握这一重要技术。 正文: 一、Socket编程概述 Socket是一种通信机制,通过它可以在不同主

    2024年02月14日
    浏览(46)
  • Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130534343 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:没有了 下一篇:《Linu

    2024年02月08日
    浏览(77)
  • c++ socket、 listen、accept、recv 、send、 connect函数记录

    __domain为协议域,又称协议族,我们最常用的有AF_INET、AF_INET6(也可以写作为PF_INET、PF_INET6),分别代表IPv4地址和IPv6地址。 __type为数据传输方式或套接字类型,最常见的有SOCK_STREAM和 SOCK_DGRAM,其中SOCK_STREAM为面向连接的数据传输方式,是基于TCP的协议,数据可以准确无误地

    2023年04月26日
    浏览(37)
  • Java网络编程(二)Socket 套接字(TCP和UDP),以及TCP的回显

    我们软件工作者,着重编写的是应用层的代码,但是发送这个数据,我们就需要将应用层传输到传输层,也就意味着我们需要调用应用层的API,统称为 Socket API。 套接字的分类: 流套接字:使用传输层TCP协议 特点: 有连接:使用 TCP 通信的双方,需要时刻保存对方的相关消

    2024年02月09日
    浏览(54)
  • Linux TCP/UDP socket 通信和IO多路复用

    主机字节序 16 位值 == 网络字节序 16 位值 主机字节序 32 位值 == 网络字节序 32 位值 主机字节序的字符串IP地址  == 网络字节序的整形IP地址 将监听的套接字和本地IP和端口进行关联 给监听的套接字设置监听,开始检测客户端链接 等待并接受客户端的连接,阻塞函数,没有客

    2024年02月05日
    浏览(61)
  • C/C++ Linux Socket网络编程 TCP 与 UDP

    之前已经学习了QT的socket编程 和 C/C++在window环境的socket编程,现在再来学习一波C/C++在Linux环境下的socket编程,为以后学习C++ Linux 服务器开发做准备。 目录 一、Socket简介 二、Socket编程基础 1. 网络字节序 2. sockaddr数据结构 3. IP地址转换函数 三、TCP编程函数 1. socket函数 2. bi

    2024年02月02日
    浏览(61)
  • 【Linux网络】TCP UDP socket HTTP webSocket之间的区别

    目录 一、OSI TCP/IP模型 二、几者之间的关系 三、HTTP 四、Socket 五、WebSocket 5.1、WebSocket 优点 首先我们要了解OSI七层模型,和预支对应的TCP/IP 四层的模型。     用下面的图可以看出,TCP  UDP 工作在传输层,而 HTTP  WebSocket 工作在应用层,但socket不属于七层模型中的任何一层,

    2024年02月11日
    浏览(37)
  • 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 + Python实现(TCP+UDP)

    简单讲一下基础知识,便于后面代码的理解,建议大概浏览一下这一小节内容。这里讲的只是冰山一角,建议大家学习计算机网络相关知识,推荐几本书: 《计算机网络》(谢希仁) 《计算机网络 自顶向下方法》 《计算机网络技术》 《计算机网络基础及应用》 《Linux C从入

    2024年02月08日
    浏览(60)
  • 【Linux网络】网络编程套接字 -- 基于socket实现一个简单UDP网络程序

    我们把数据从A主机发送到B主机,是目的吗?不是,真正通信的不是这两个机器!其实是这两台机器上面的软件(人) 数据有 IP(公网) 标识一台唯一的主机 ,用谁来标识各自主机上客户或者服务进程的唯一性呢? 为了更好的表示一台主机上服务进程的唯一性,我们采用 端口号

    2024年02月12日
    浏览(159)
  • TCP、UDP、IP以及ensp基本配置

    目录 一、TCP报文段 二、UDP报文段 三、IP报文段 四、ensp基本配置​          源端口号: 表示发数据那个进程的端口号。          目的端口号: 表示收数据那个进程的端口号。          校验和: 验证数据的传输是否是正确的。          选项 :扩展Tcp功能时

    2024年02月02日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包