当前位置: 首页 > 编程日记 > 正文

UDP客户端不用绑定吗IP和端口?

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  书上都是这么说的,UDP客户端不用绑定IP和端口,操作系统会给它自动分配端口。。。。

  但是虽然没有显示绑定,但是操作系统却似乎做了些隐蔽的事情。

首先,在客户端,fd = socket(AF_INET, SOCK_DGRAM, 0),然后就想在此fd下进行recvfrom是收不到对方(假设对方就是服务器吧)的消息是办不到的,其实想想也很容易明白,这是fd未和任何端口、 IP产生关联要是这样都能收到消息,那真要乱套了。想要在没绑定的情况下受到服务器发来的消息,首先客户端得通过fd描述符首先向服务器发信息,然后这时 在fd下进行阻塞recvfrom就能收到消息了,如果再在客户端上fd 1= socket(AF_INET, SOCK_DGRAM, 0),想在fd1 上进行recvfrom依然收不到消息,因为fd和服务器同过信,但fd1没有,所以fd1收不到,但是从fd1向服务器发消息没问题!所一总结一下就 是,只有当已通过fd向服务器发送了消息时(并且已经发通了),才能在fd处收到服务器发回来的消息,但是向服务器发送消息就不需要。所以说操作系统在此 做了些隐蔽的事情,当fd首先向服务器发消息时客户端自动选折IP和一个PORT与该fd关联了起来,(我觉得相当于背后还是绑定了一样)。而后面创建的 fd1和之前的fd他们出客户端的PORT是不同的(我在服务器端检测了一下),所以通过fd向服务器发了消息但想在新建立的fd1下去recvfrom 收不到消息。

  另外,只能对一个socket描述符绑定一次,不能绑定多次,除非前面已经将该描述符close了。

 反过来一个端口也只能被绑定到同一个socket描述符上,除非他们使用的不同的协议。

下面有一些验证代码:

client.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 50126
#define MAXDATASIZE 100

int main(int argc, char *argv[])
{
int fd1, numbytes;
char recvbuf[MAXDATASIZE];
char sendbuf[MAXDATASIZE];
struct sockaddr_in server,self,rep;
if ((fd1=socket(AF_INET, SOCK_DGRAM, 0))==-1){
printf("socket() error\n");
exit(1);
}

int server_ip1;

bzero(&self,sizeof(self));
self.sin_family = AF_INET;
self.sin_port = htons(PORT);
inet_pton(AF_INET, "10.10.1.103", (void*) &server_ip1);
        server.sin_addr.s_addr = server_ip1;

bind(fd1,(struct sockaddr*)&self,sizeof(self));

int server_ip;
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
inet_pton(AF_INET, "10.10.1.103", (void*) &server_ip);
        server.sin_addr.s_addr = server_ip;

        socklen_t len;
         len=sizeof(struct sockaddr_in);
 printf("input message:");
         fgets(sendbuf,40,stdin);
sendto(fd1,sendbuf,strlen(sendbuf),0,(struct sockaddr *)&server,len);
printf("send already\n");
int fd2=socket(AF_INET,SOCK_DGRAM,0);
int i=bind(fd2,(struct sockaddr*)&self,sizeof(self));
printf("%d\n",i);
memset(sendbuf,0,sizeof(sendbuf));
fgets(sendbuf,sizeof(sendbuf),stdin);
sendto(fd2,sendbuf,strlen(sendbuf),0,(struct sockaddr *)&server,len);
memset(recvbuf,0,sizeof(recvbuf));
recvfrom(fd1,recvbuf,strlen(sendbuf),0,(struct sockaddr * ) &rep,&len);
printf("A server give me:%s\n",recvbuf );
recvfrom(fd2,recvbuf,strlen(sendbuf),0,(struct sockaddr * ) &rep,&len);
printf("fd2 server give me:%s\n",recvbuf);

return 0;
}

service.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<errno.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#define  SERADDR "127.0.0.1"
int main(int ar, char**argv) {
        int fd1, fd2;
        char *s;
        char ss[20];
        char port[7];
        int server_ip;
        char buf[1024];
        int len=sizeof(struct sockaddr);
        int sin_size = sizeof(struct sockaddr_in);
        struct sockaddr_in local_addr,other,other1;
        if (-1 == (fd1 = socket(AF_INET, SOCK_DGRAM, 0))) {
                perror("fail to socket\n");
                exit(0);
        }
        memset(buf,0,1024);
        memset(&local_addr,0,sizeof(struct sockaddr));
        local_addr.sin_family = AF_INET;
        local_addr.sin_port = htons(50126);

        inet_pton(AF_INET, "10.10.1.103", (void*) &server_ip);
        local_addr.sin_addr.s_addr = server_ip;


        if (bind(fd1, (struct sockaddr*) &local_addr, sizeof(struct sockaddr))
                        < 0) {
                fprintf(stderr, "error:bind() error!\n");
    exit(-1);
        }


        recvfrom(fd1,buf,1023,0,(struct sockaddr*)&other,&len);
        in_port_t temport=ntohs(other.sin_port);
        sprintf(port,"%u",temport);
        printf("A,port =%s\n",port);
        printf("A ,client give me:%s\n",buf);
        memset(buf,0,sizeof(buf));

        recvfrom(fd1,buf,1023,0,(struct sockaddr*)&other1,&len);
        printf("B ,cLient give me:%s\n",buf);
        in_port_t temport1=ntohs(other1.sin_port);
        memset(port,0,sizeof(port));
        sprintf(port,"%u",temport1);


        printf("B,port=%s\n",port);
        //printf("hhhhhh\n");
        sendto(fd1,buf,strlen(buf),0,(struct sockaddr*)&other,sizeof(struct sockaddr_in));
        sendto(fd1,"OKOKOK",6,0,(struct sockaddr*)&other1,sizeof(struct sockaddr_in));

      
        return 0;

}

转载于:https://my.oschina.net/u/138210/blog/59386

相关文章:

算法实现太难了?机器学习也需要开源软件

作者 | Soren Sonnenburg等译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;开源工具已经趋于成熟&#xff0c;这使其能构建大规模的自然场景下的系统。与此同时&#xff0c;机器学习领域为各种应用开发了大量强大的学习算法。但是&#x…

数据库备份定期删除程序的开发。

第一.最近客户的服务器数据库备份每天都在进行&#xff0c;随着数据量的不断的增加&#xff0c;备份也在不断的进行变大。 第二.于是一些问题就出现了客户的服务器的磁盘的空间有限&#xff0c;定期数据库备份文件太大而导致无法进行保存问题。 第三.从而导致了服务器宕机以及服…

Repeater控件的分页问题

作者&#xff1a;zhoubinmail.sdu.edu.cn以前做ASP的时间不算短&#xff0c;可是做ASP.NET我是个新手。前几天做项目&#xff0c;遇到一个问题&#xff0c;要求比较复杂的数据格式显示&#xff0c;用DataGrid非常难实现&#xff0c;后来改用了Repeater控件来实现。不过这样就带…

华为昇腾AI全栈知识深入解读,师资培训沙龙深圳场圆满落幕!

头图 | 视觉中国极度缺乏AI人才&#xff0c;已成为中国人工智能产业发展道路上的瓶颈。在国家政策的支持下&#xff0c;众高校初建AI专业者甚多&#xff0c;但高校教师应掌握哪些知识储备来传道授业&#xff0c;大家都是“摸着石头过河”。将高校AI人才培养教学大纲与厂商成熟落…

[转载] 信息系统项目管理师考试论文写作要点

来源&#xff1a;信管网 网址&#xff1a;http://www.cnitpm.com/pm/4323.html &#xff08;1&#xff09;在论文写作之前&#xff0c;先不要急着动笔&#xff0c;认真把题看清楚&#xff0c;选择自己熟悉的论文&#xff08;考试时&#xff0c;一般是二选一&#xff09;&#x…

POM.xml 标签详解

pom作为项目对象模型。通过xml表示maven项目&#xff0c;使用pom.xml来实现。主要描述了项目&#xff1a;包括配置文件&#xff1b;开发者需要遵循的规则&#xff0c;缺陷管理系统&#xff0c;组织和licenses&#xff0c;项目的url&#xff0c;项目的依赖性&#xff0c;以及其他…

DataRow的序列化问题

来源&#xff1a;CSDN 作者&#xff1a;kroll 在.net里&#xff0c;DataRow类型的对象是不支持序列化的&#xff0c;那么如果在一个需要序列化的对象中含有DataRow类型的字段该怎么办呢&#xff1f;呵呵&#xff0c;幸好Datatable是支持序列化的。因此&#xff0c;我们可以自定…

mass Framework event模块 v4

event.js // // 事件模块&#xff08;包括伪事件对象&#xff0c;事件绑定与事件代理&#xff09; // $.define("event",document.dispatchEvent ? "node" : "node,event_fix",function(){// $.log("已加载target模块")var rhoverH…

美国 AI 博士:什么都不会怎么学 Python?

我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0…

puppet 初识

【puppet初识】学习目录 领导说saltstack太慢 机器量一旦上来&#xff0c;saltstack就力不从心&#xff0c;所以要将saltstack转向puppet。【安装背景】系统centos 6.5软件地址:http://downloads.puppetlabs.com/puppet/master: 192.168.100.10agent: 192.168.100.13因为puppe…

ColorMatrix 彩色矩阵

选择自 hbzxf 的 Blog 首先对装配脑袋给出上两片文章的友好回复&#xff0c;还有网友Fisherman一起探讨ColorMatrix话题表示感谢&#xff01;ColorMatrix (彩色矩阵) 类位于System.Drawing.Imaging命名空间 先看看下面的代码 ColorMatrix cm newColorMatrix(newfloat[][]{ n…

​一个参数一张Excel表,玩转Pandas的read_excel()表格读取

作者 | 黄伟呢来源 | 数据分析与统计学之美我觉得很有必要讲述这个文章&#xff0c;进行数据处理的第一步就是Python数据读取。但是你可能没想到&#xff0c;在进行数据读取的同时&#xff0c;我们其实可以配合相关参数做很多事儿&#xff0c;这对于后续的数据处理都是极其有帮…

Android 设计模式:(三)装饰者模式 —— 装饰对象

*利用组合&#xff08;composition&#xff09;和委托&#xff08;delegation&#xff09;可以在运行时实现继承行为的效果&#xff0c;动态地给对象加上新的行为。*利用继承扩展子类的行为&#xff0c;是在编译时静态决定的&#xff1b;利用组合的做法&#xff0c;可以在运行时…

润乾报表永久授权说明

永久授权是什么&#xff1f; 永久授权是运行润乾报表的带有机器特征码的没有时间限制的正式授权文件 2 机器特征码是什么&#xff1f; 机器特征码是为了制作永久授权&#xff0c;由润乾公司提供程序从用户的服务器上获取硬件和操作系统信息&#xff0c;生成的一个数字串&#x…

维度爆炸?Python实现数据压缩如此简单

作者 | 萝卜来源 | 早起Python&#xff08;ID: zaoqi-python&#xff09;用Python基于主成分分析常见的三个应用场景中&#xff0c;其中有一个是「数据描述」&#xff0c;以描述产品情况为例&#xff0c;比如著名的波士顿矩阵&#xff0c;子公司业务发展状况&#xff0c;区域投…

深入剖析C#的多态

作者: 天雨一、什么是多态 面向对象程序设计中的另外一个重要概念是多态性。在运行时&#xff0c;可以通过指向基类的指针&#xff0c;来调用实现派生类中的方法。可以把一组对象放到一个数组中&#xff0c;然后调用它们的方法&#xff0c;在这种场合下&#xff0c;多态性作用…

/usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux)

/usr/bin/ld: /usr/local/lib/libz.a(crc32.o): relocation R_X86_64_32 against a local symbol can not be used when making a shared object; recompile with -fPIC /usr/local/lib/libz.a: could not read symbols: Bad value 一般是64 位 电脑才会出现。 解决方法如下&am…

关于BIO | NIO | AIO的讨论

关于BIO | NIO | AIO的讨论一直存在&#xff0c;有时候也很容易让人混淆&#xff0c;就我的理解&#xff0c;给出一个解释&#xff1a; BIO | NIO | AIO&#xff0c;本身的描述都是在Java语言的基础上的。而描述IO&#xff0c;我们需要从两个层面&#xff1a; 编程语言实现原理…

NYOJ-49 开心的小明

开心的小明 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述小明今天很开心&#xff0c;家里购置的新房就要领钥匙了&#xff0c;新房里有一间他自己专用的很宽敞的房间。更让他高兴的是&#xff0c;妈妈昨天对他说&#xff1a;“你的房间…

两个硬盘和文件相关的小技巧 (C#)

取系统的硬盘分区的盘符&#xff0c;用API函数&#xff1a;GetDriveType [DllImport("kernel32.dll", EntryPoint"GetDriveType")] public static extern int GetDriveType (string nDrive); 调用&#xff1a;string [] dirs Environment.GetLogicalDri…

从数百个Excel中查找数据,一分钟用Python搞定

作者 | 陈熹来源 | 早起Python今天分享一个真实的办公自动化需求&#xff0c;大家一定要仔细阅读需求说明&#xff0c;在理解需求之后即可体会Python的强大。需求说明首先我们来看下今天的需求&#xff0c;有一份档案记录总表的Excel工作簿&#xff0c; 每天会根据当天日期建立…

namenode如何存储复本?

2019独角兽企业重金招聘Python工程师标准>>> namenode如何选择在哪个datanode存储复本&#xff1f;这里需要对可靠性&#xff0c;写入带宽和读取带宽进行权衡。例如&#xff0c;把所有复本都存储在一个节点损失的写入带宽最小&#xff0c;因为复制管线都是在同一节点…

EBS-使用 fnd_user_pkg API 创建用户,添加职责,修改用户

比如有一个外围支持系统&#xff0c;用户需要在外围系统登录之后点个link就可以登录到Oracle ERP系统中&#xff0c;那么我们需要先把外围系统的用户创建在Oracle ERP中&#xff0c;并且分配职责给他。 DECLARE a BOOLEAN; BEGIN---------------------------------------------…

万字长文总结机器学习的模型评估与调参 | 附代码下载

作者 | Sebastian Raschka翻译&整理 | Sam来源 | SAMshare目录一、认识管道流1.1 数据导入1.2 使用管道创建工作流二、K折交叉验证2.1 K折交叉验证原理2.2 K折交叉验证实现三、曲线调参3.1 模型准确度3.2 绘制学习曲线得到样本数与准确率的关系3.3 绘制验证曲线得到超参和准…

[百万级]通用存储过程.分页存储过程

/* 名称:spAll_ReturnRows 输入: 输出: 调用: EXEC spAll_ReturnRows SELECT * FROM 表名, 页号, 返回记录数, 主键, 排序字段 spAll_ReturnRows SELECT * FROM all_Categories,2,10,[ID],[ID] 说明:[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录 …

Unsupported major.minor version (jdk版本错误)解决方案

2019独角兽企业重金招聘Python工程师标准>>> 如果你遇到了 Unsupported major.minor version &#xff0c;请认真看一下&#xff0c;说不定会有帮助。 我花两个小时总结的经验&#xff0c;你可能10分钟就得到了。 ^**^ 一、错误现象&#xff1a; 当改变了jdk版本时…

The key of C# 学习笔记I-II

作者 &#xff1a;Kemins booootLog http://blog.csdn.net/keminlau/ Sunday, October 3, 2004 微软提出的CLS(Common Language Specification, 通用语言标准)对能被用来编写dotNET程序的语言的最小功能集做出了规定。 就拿C#来说&#xff0c;它是目前程序设计语言“以效率换安…

分布式平台下的HS(High-Security) --Apache Shiro API(介绍)

在尝试保护你的应用时&#xff0c;你是否有过挫败感?是否觉得现有的Java安全解决方案难以使用&#xff0c;只会让你更糊涂?本文介绍的Apache Shiro&#xff0c;是一个不同寻常的Java安全框架&#xff0c;为保护应用提供了简单而强大的方法。本文还解释了Apache Shiro的项目目…

豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」

来源 | HyperAI超神经这几天&#xff0c;传出 NVIDIA 将以 400 亿 英镑的价格收购 ARM 的消息&#xff0c;不少媒体在争相报道收购进度的同时&#xff0c;也将整起交易的幕后推手 —— 孙正义&#xff0c;放到了聚光灯下。软银 CEO&#xff0c;传奇投资人&#xff0c;冒险家&am…

Java 集合 — HashMap

HashMap 无序&#xff08;每次resize的时候都会变&#xff09;非线程安全key和value都看可以为null使用数组和链表实现查找元素的时候速度快几个重要属性&#xff1a; loadFactor&#xff1a;用来计算thresholdthreshold&#xff1a;决定map是否需要扩容&#xff0c;threshold …