百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Linux网络编程——绑定( bind )端口需要注意的问题

mhr18 2024-12-01 09:11 18 浏览 0 评论

所谓绑定(bind)是指别人连接我只能通过我所绑定的端口,相当于,我买了一个手机,别人要想联系我,必须要知道我的手机号码,这时候,我需要怎么办呢?我需要给手机插上电话卡,固定一个电话号码,这样别人就能通过这个电话号码联系我。手机插上电话卡,固定一个电话号码,类似于绑定(bind)的过程,绑定(bind)为了固定一个端口号,别的网络程序就可以找到这个端口号,找到这个端口号就能找到这个端口号所对应的网络应用程序。

在网络编程里,通常都是在服务器里绑定(bind)端口,这并不是说客户端里不能绑定(bind)端口,但这里需要注意的是,一个网络应用程序只能绑定一个端口( 一个套接字只能 绑定一个端口 )。

一个套接字不能同时绑定多个端口,如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
int main(int argc, char *argv[])
{
	char server_ip[30] = "10.221.20.12";
 
	int sockfd;
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);    	//创建UDP套接字
	if(sockfd < 0)
	{
		perror("socket");
		exit(-1);
	}
 
	// 初始化本地网络信息
	struct sockaddr_in my_addr;
	bzero(&my_addr, sizeof(my_addr));
	my_addr.sin_family = AF_INET;
	my_addr.sin_port   = htons(8000);
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 
	// 第一次绑定端口8000
	int err_log;
	err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
	if(err_log != 0)
	{
		perror("bind 8000");
		close(sockfd);		
		exit(-1);
	}
 
	// 又一次绑定别的端口9000, 会绑定失败
	my_addr.sin_port = htons(9000);
	err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
	if(err_log != 0)
	{
		perror("bind 9000");
		close(sockfd);		
		exit(-1);
	}
 
	close(sockfd);
	return 0;
}

程序编译运行后结果如下:

如果客户端想绑定端口号,一定要调用发送信息函数之前绑定( bind )端口,因为在发送信息函数( sendto, 或 write ),系统会自动给当前网络程序分配一个随机端口号,这相当于随机绑定了一个端口号,这里只会分配一次,以后通信就以这个随机端口通信,我们再绑定端口号的话,就会绑定失败。如果我们放在发送信息函数( sendto, 或 write )之前绑定,那样程序将以我们绑定的端口号发送信息,不会再随机分配一个端口号。

需要C/C++ Linux服务器架构师学习资料私信“资料”(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

绑定失败例子( UDP )如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
int main(int argc, char *argv[])
{
	char server_ip[30] = "10.221.20.12";
	
	int sockfd;
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);    	//创建UDP套接字
	if(sockfd < 0)
	{
		perror("socket");
		exit(-1);
	}
	
	struct sockaddr_in dest_addr;
	bzero(&dest_addr, sizeof(dest_addr));
	dest_addr.sin_family = AF_INET;
	dest_addr.sin_port   = htons(8080);	// 服务器的端口
	inet_pton(AF_INET, server_ip, &dest_addr.sin_addr);
	
	char send_buf[512] = "this is for test";
	// 如果前面没有绑定端口,sendto()系统会随机分配一个端口
	sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));//发送数据
	
	// 初始化本地网络信息
	struct sockaddr_in my_addr;
	bzero(&my_addr, sizeof(my_addr));
	my_addr.sin_family = AF_INET;
	my_addr.sin_port   = htons(8000);
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	// sendto()后面绑定端口,绑定失败
	int err_log;
	err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
	if(err_log != 0)
	{
		perror("bind 8000");
		close(sockfd);		
		exit(-1);
	}
 
	close(sockfd);
	return 0;
}

程序编译运行后结果如下:

相关推荐

LabVIEW实现Oracle数据库的访问(labview oracle)

1.安装Oracle客户端下载:从Oracle官方网站下载适用于Windows操作系统的Oracle驱动程序。确保下载的版本与LabVIEW环境和操作系统兼容。1)以Windo...

【Docker 新手入门指南】附:Windows系统安装Docker

一、Windows10/11安装(推荐DockerDesktop)1.系统要求操作系统:仅支持Windows10/11专业版、企业版、教育版或家庭版(需开启WSL2)。硬件要求...

【Windows篇】告别误操作:简单几步隐藏Windows关机按钮

前言最近小编遇到客户想要将VirtualBox发布为虚拟应用供用户使用,但是遇到了问题,就是安装好VirtualBox无法打开虚拟机,打开提示报错。如图:客户是在vSphere虚拟化环境中安装的Win...

PL/SQL 杂谈(七)(pl/sql相关知识)

承接(六)。今天来聊聊SQL*Plus中的异常处理。SQL*Plus表达运行成功的方式与命令的种类相关。对于大多数SQL*Plus独有的命令,如果没有返回错误信息,那么就表示运行成功。另一方面...

PL/SQL 杂谈(四)(pl sql怎么使用)

承接(三)。晚上在家闲来没事,这次我们来聊一聊关于创建和运行PL/SQL代码的的一些建议。假设一个PL/SQL程序员从来没考虑过诸如系统设计或者单元测试这样的任务,那么他至少应该熟悉下面这些操作...

Chat2DB 一款有开源免费的多数据库客户端工具

Chat2DB是一款有开源免费的多数据库客户端工具,支持Windows、Mac本地安装,也支持服务器端部署,Web网页访问。下面我们就来看看在Windows中如何使用。官网地址:https://ch...

CDM多副本数据备份——灾备云(cdh灾备)

多副本数据备份定义:即概念数据模型(ConceptualDataModel)又称CDM,是面向数据库用户的现实世界的模型,主要用来描述世界的概念化结构,它使数据库的设计人员在设计的初始阶段,摆脱计...

超详细!虚拟机搭建 OpenWrt 软路由小白入门教程,一看就懂!

在前几篇文章中,我们已经向大家介绍了ikuai软路由、iStoreOS软路由,并且展示了如何利用虚拟机完成其安装的过程。而在本篇文章里,我们将向大家介绍openWRT路由系统,并为大家演示如何通过虚拟...

绿盟科技助力甲骨文 首发现Weblogic反序列化远程代码执行漏洞

日前,绿盟科技发现Oracle(甲骨文)公司高危漏洞:Weblogic反序列化漏洞(CVE-2018-2628),该漏洞由绿盟科技首先发现,并及时上报给了Oracle官方,关于该漏洞的更多信息以及绿盟...

Oracle Linux 9.6安装体验(linux oracle安装步骤详细)

内核版本版本uek内核rhck内核ID_LIKE代号9.66.12.0-1.23.3.25.14.0-570.12.1.0.1fedoraPlow9.55.15.0-302.167.65.14.0-5...

关于感恩,行装上路(关于感恩与行的内容)

想最近写一篇关于感恩的文章,先在此酝酿一下,关于感恩还是感慨良多,我就再感慨一把吧。大家看完就别感慨了。在人生的征程之中,会有很多的选择,似乎之前的几次工作离开都没有如此的沉重,可能时间呆的越长越有感...

数据清洗做不好,整个中台都白搭!

这几年,很多企业都在做数据中台,从建平台、连数据,到推BI、搭指标、做分析,大量人力物力全都砸进去了。平台也上线了,数据也看得见,仪表盘一顿酷炫展示,可老板一句话就让场面瞬间冷了下来:“这数据可靠吗?...

通过ETL工具完成达梦数据库数据同步至数仓Oracle的具体实现

企业在日常运营过程中,会产生海量的数据,这些数据广泛分布于不同的系统、数据库以及存储设备之中。为了充分发挥数据的价值,确保数据的一致性、完整性与可用性,数据同步便成为了企业数据管理体系里至关重要的一环...

Dubai&#39;s AI Boom Lures Global Tech as Emirate Reinvents Itself as Middle East&#39;s Silicon Gateway

AI-generatedimageAsianFin--Dubaiisrapidlytransformingitselffromadesertoilhubintoaglob...

OpenAI Releases o3-pro, Cuts o3 Prices by 80% as Deal with Google Cloud Reported to Make for Compute Needs

TMTPOST--OpenAIisescalatingthepricewarinlargelanguagemodel(LLM)whileseekingpartnershi...

取消回复欢迎 发表评论: