简析socket里面的bind指令(写写帮推荐)

时间:2019-05-14 18:21:20下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《简析socket里面的bind指令(写写帮推荐)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《简析socket里面的bind指令(写写帮推荐)》。

第一篇:简析socket里面的bind指令(写写帮推荐)

简单分析一下socket中的bind

在最开始接触bind的时候,只是在写基于tcp的server端的时候,知道在listen之前需要先bind一下,用来确保socket能在某个固定的端口监听。而bind的时候,函数参数中的端口填自己将要绑定的端口就行;而IP地址,需要填本机的IP,但是也可以用一个宏INADDR_ANY代替,用这个宏就可以不用查找本机的IP,它就可以代替本机的IP。当时只觉得这个INADDR_ANY比较神奇,但是由于当时觉得用起来很方便,也没出啥问题,也就没有再深究。

但是最近在做RTSP服务器的时候,有种特殊的应用,导致我不得不对bind这个函数仔细地看一下。

我们知道无论是UDP还是TCP,socket都会与一个本地的IP和端口想对应,我们往往把这个IP和端口称之为socket的源地址和源端口。当我们作为客户端利用socket去发送数据时,很少会去考虑这个源地址和源端口到底是什么,我们更关心的是它的目的地址和端口。我们往往只有在监听的时候,才去考虑这个源端口,所以我们在监听的时候会去用bind。当我们bind之后,内核就会将这个socket的源端口锁定到我们设定的端口上。但是这就有一个问题,这个bind绑定端口,是将本来没有源端口的socket绑定到我们指定的端口上,还是将一个已经分配了端口的socket重定向到我们指定的端口上呢?

在《UNIX网络编程》这本书中提到:“如果一个TCP客户或者服务器未曾调用bind捆绑一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时接口。”从这句话中可以判断出,其实在调用socket函数创建socket时,内核还并未给socket分配源地址和源端口。而对于UDP,我猜测在调用sendto发送数据时,在未捆绑端口的情况下,内核也会随机分配端口。

而我遇到的特殊应用要求我在用UDP发送数据之前要告诉对方我的发送端口,这也就意味着我在sendto之前必须要捆绑端口,因此我在发送数据之前就得调用bind函数绑定一下端口了。但是我就在想内核既然有随机分配端口的能力,而我需要的也只是让它绑定一下而不用绑定在固定端口的业务,socket中应该能够提供这种业务。然后果然我发现bind就具备这种能力,当bind的参数中端口地址为0的时候,这时候就是由内核分配端口。这样我就不用考虑端口地址重复的问题,而放心的把这个问题交给内核处理了。

就在发现bind的这个机制的同时,我发现其实bind对于源地址也同样具备这种处理方式,当系统具有多IP(多网卡)的情况,当我们把bind函数中的ip参数置0时,就是由内核自己选择分配IP。而之前一直觉得很神奇的INADDR_ANY其实一点也不神奇,它的值其实就是0。所以当我们只有单一IP的时候,我们就可以用INADDR_ANY去代替那个单一的IP,因为内核分配的时候只能选择这一个IP。从而造成了INADDR_ANY就是本机IP的现象。

第二篇:bind函数

首先,服务器和客户端都可以bind,bind并不是服务器的专利。

客户端进程bind 端口:由进程选择一个端口去连服务器,注意这里的端口是客户端的端口。如果不分配就表示交给内核去选择一个可用端口。

客户端进程bind IP地址:相当于为发送出去的IP数据报分配了源IP地址,但交给进程分配IP地址的时候(就是这样写明了bind IP地址的时候)这个IP地址必须是主机的一个接口,不能分配一个不存在的IP。如果不分配就表示由内核根据所用的输出接口来选择源IP地址。

一般情况下客户端是不用调用bind函数的,一切都交给内核搞定,YES!

服务端进程bind端口:基本是必须要做的事情,比如一个服务器启动时(比如freebsd),它会一个一个的捆绑众所周知的端口来提供服务,同样,如果bind了一个端口就表示我这个服务器会在这个端口提供一些“特殊服务”。

服务端进程bind IP地址:目的是限制了服务端进程创建的socket只接受那些目的地为此IP地址的客户链接,一般一个服务器程序里都有

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);// 只是针对IP4,IP6代码不太一样

这样一句话,意思就是:我不指定客户端的IP,随便连,来者不拒!

总之只要你bind时候没有指定哪一项(置为0),内核会帮你选择。

第三篇:socket多人聊天程序

实现思路

服务器端

1.用一个Map保存“在线的用户”,键——用户的名称

值——当前用户对应socket对象

2.为每一个接通的客户端(socket对象)开通一条线程,这条线程绑定的任务是: 读取客户端发送的消息 然后再发送每个用户

(我们可以认为这个Map就是一个聊天室,map中的一个成员就是一个用户);获得当前客户端发送过来的信息, 当前“聊天室”内的所有“用户”都接收到信息。

当某用用户断开连接表明此用户离开了, 为这个用户开通的这条线程结束,同时需要释放资源,所以在finnaly块中要 关闭流对象, 将此用户移除Map,同时广播某某人离开了如:客户端

客户端第一次登录必须先输入用户名并发送给服务器注册

System.out.println(“请输入用户名:”);

userName = get.readLine();

pw.println(“1-”+userName);

然后发送消息:

公聊pw.println(“2-”+username+“-”+消息内容);私聊pw.println(“3-”+username+“-”+收消息人名字+“-”+消息内容);

那么服务端 读取客户端的消息后分隔字符串msg =bufRead.readLine()String[] arrMsg=msg.split(“-”);arrMsg[0]是标识arrMsg[1]就是用户名 判断标识:

* 服务器收到消息 1开头表示新加入的聊天用户

2开头表示公聊消息;

3开头表示私聊消息

标识是1, 新用户登录,获得当前客户端的用户名,加入到Map中并给每个用户广播某某登录了客户端发送格式:1-用户名标识是2是公聊的消息,则将此消息转发给所有用户 客户端发送消息的格式是:2-用户名=消息内容标识是3是私聊的消息,则将此消息转发给指定用用户 客户端发送消息的格式是:2-发送者-接收者-消息内容分隔字符串后arrMsg[1]消息发送者,arrMsg[2]收消息者 arrMsg[3]消息内容

客户器端

1.首先输入用户名向服务器注册

2.定义菜单选择是公聊或私聊

3.启用一个线程负责读服务器广播的消息

4.循环向服务器发送消息 根据收消息者的名称 到Map中找到对应的Socket ,向收消息者发送消息msg=arrMsg[1] +“对你说:”+ arrMsg[3] 根据发送者的名称 到Map中找到对应的Socket ,向发送者发送消息msg=“你对” + arrMsg[2] +“说:”+ arrMsg[3]

第四篇:socket编程实验心得体会

实验心得体会

在本次实验中,我通过对网络课上所学知识的应用,学到了很多实践中的知识。并且加深了我对课本知识的理解和认识,在实验过程中,更容易记忆和深入理解各种协议的工作以及在网络编程中应该注意的一系列问题。

我们的第一个实验是对ARP、ICMP、FTP和HTTP协议的分析和验证。在利用软件Etherpeek抓取在主机通信中的报文,得到了很多的关于这些协议的具体参数。在课程学习过程中,书本和老师给我的感觉就是太枯燥,通过课本的学习根本没有办法理解各种协议的工作细节。有很多的细微之处是想不通的。但是,在本次实验中,我就通过各种报文的分析,看到了网络中不同层次协议之间的协做过程。对应不同层之间就是通过协议来使用,我对整个网路的大体架构有了一个统筹的了解,虽然对很多的更深入的知识不是很了解,但是比我在课上学的东西要更有趣,而且容易学习,更能够我学习的兴趣。

第二个实验是Socket编程实验。在编写网络程序之前,我对网路通信可以说一无所知,根本不知道那些网路上的程序是怎么通过网路进行通信的。在本次实验中,终于揭开了他们神秘的面纱。当然在实验中出现了很多的插曲,我是在Linux环境下编写的程序,很多技术方面的问题都无法解决。查阅书籍和网上咨询才弄懂了他们的来龙去脉,最终是将我的程序编写完了。开始接触网路编程时,那是一头雾水,根本不知从何下手。在看了辅导教员给我们程序之后才有了很多的起色,才能够自己编写程序。在网络编程中,我最深的体会就是对具体的内部细节不熟悉,导致在调试的过程中感觉到很无力。在很多函数的作用下,经常就是一团乱麻。之后,我每次编写之前就是将用到的函数的用法温习一下,最后还是能够解决很多的问题的。

本次试验是我们学习网路的第一次。以前的课程从来没有接触到网路方面的知识。这次的新知识对我们的挑战还算不是太大,通过我们的努力,所有的困难时被克服掉了。其实,实验应该是我们的重点,在以后的工作中要的就是我们的实际的动手能力,如果我们在学习期间就是只学了书本上的知识,那样对理论的了解是不够深刻的,只有通过实验才能激发我们的学习兴趣。总之,我觉得实验才是检验理论的唯一标准。

第五篇:c语言简单socket通信

server:

#include

#include

#pragma comment(lib,“ws2_32.lib”)

int main(int argc, char* argv[]){

//³õʼ»¯WSA

WORD sockVersion = MAKEWORD(2,2);WSADATA wsaData;if(WSAStartup(sockVersion, &wsaData)!=0){return 0;} //´´½¨Ì×½Ó×Ö SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(slisten == INVALID_SOCKET){printf(“socket error!”);return 0;} //°ó¶¨IPºÍ¶Ë¿Ú sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = INADDR_ANY;if(bind(slisten,(LPSOCKADDR)&sin, sizeof(sin))== SOCKET_ERROR){printf(“bind error!”);} //¿ªÊ¼¼àÌý if(listen(slisten, 5)== SOCKET_ERROR){} //Ñ-»·½ÓÊÕÊý¾Ý SOCKET sClient;sockaddr_in remoteAddr;printf(“listen error!”);return 0;

char revData[255];while(true){printf(“µÈ´ýÁ¬½Ó...n”);sClient = accept(slisten,(SOCKADDR *)&remoteAddr, &nAddrlen);if(sClient == INVALID_SOCKET)

{

printf(“accept error!”);

continue;

}

printf(“½ÓÊܵ½Ò»¸öÁ¬½Ó£º%s

inet_ntoa(remoteAddr.sin_addr));

//½ÓÊÕÊý¾Ý

int ret = recv(sClient, revData, 255, 0);

if(ret > 0)

{

revData[ret] = 0x00;

printf(revData);

}

//·¢ËÍÊý¾Ý

char * sendData = ”ÄãºÃ£¬TCP¿Í»§¶Ë£¡n“;

send(sClient, sendData, strlen(sendData), 0);

closesocket(sClient);

}

closesocket(slisten);

WSACleanup();

return 0;

}

client:

#include

#include

#pragmacomment(lib,”ws2_32.lib“)

rn”,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_STREAM, IPPROTO_TCP);if(sclient == INVALID_SOCKET)

{

printf(“invalid socket!”);

return 0;

}

sockaddr_in serAddr;

serAddr.sin_family = AF_INET;

serAddr.sin_port = htons(8888);

serAddr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”);

if(connect(sclient,(sockaddr *)&serAddr, sizeof(serAddr))SOCKET_ERROR)

{

printf(“connect error!”);

closesocket(sclient);

return 0;

}

char * sendData = “ÄãºÃ£¬TCP·þÎñ¶Ë£¬ÎÒÊÇ¿Í»§¶Ë!n”;

send(sclient, sendData, strlen(sendData), 0);

char recData[255];

int ret = recv(sclient, recData, 255, 0);

if(ret > 0)

{

recData[ret] = 0x00;

printf(recData);

}

closesocket(sclient);

WSACleanup();

return 0;

} ==

下载简析socket里面的bind指令(写写帮推荐)word格式文档
下载简析socket里面的bind指令(写写帮推荐).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    指令及其例文

    文 章 来源 莲山 课件 w w w.5 Y k J.cOM公文 一、指令的定义和适用范围指令是专门发布经济、科研等方面的指示性和规定性相结合的措施和要求的下行公文。1987年《国家行政......

    常用指令总结

    常用BSC命令小结: ZEEI:BTS/BCF=BTS号/BCF号;查看BTS/BCF的详细信息(载频数、频点、所在BCSU) ZEEI::BCSU;查看当前BSC最大容纳载频数及各BCSU下所有载频数 ZERO:BTS= BTS号,TRX=TRX号......

    里面是什么教学设计(精品)

    里面是什么教学设计(精品)国家:美国年级或年龄:八岁“你们猜这只口袋里是什么东西?”史蒂文斯小姐把一只吹鼓了的纸口袋(里面套着塑料袋)放在那些八岁的孩子们都能看到的地方,孩子们......

    学里面教学反思大全

    一次,我教幼儿学习“上面”、“下面”、“在”、“里面”这几个方位词。前面三个词,小朋友很快学会并能运用了,“里面”这个词总是学不会。这时候,有个小朋友把鞋脱也下来,并把鞋......

    socket网络课设报告

    基于C/S结构的套接字程序设计 ----通过socket实现服务端功能 学 院: 信息技术工程学院 _ 专 业: 计算机科学与技术 _ 班 级: *班 _ 姓 名: 陈*** 学 号: 0123456789 指导老师: *......

    学习心得(数据库操作与socket)专题

    学习心得 ——数据库操作与socket 编程目的: 编写一个java程序,应用socket,用客户端发送信息,服务器端以用户icstest身份连接数据库ordb3,并根据客户端发送的信息,对数据库ordb3中......

    socket通信原理(精选多篇)

     Socket原理,大致分为以下几个步骤。 服务器端的步骤如下。(1)首先,在实用Socket之前,要首先初始化Socket,就是实用AfxSocketInit函数。 (2)在初始化完成以后,就可以建立服务端的Sock......

    安全生产指令

    安全生产指令 一、 安全生产是人命关天的大事。各级领导、全体干部和每个职工,都必须高度重视安全生产,坚持“安全第一,预防为主”的方针,关爱生命,坚决遏制人身伤亡事故和各类......