(十一)socket、connect、bind函数详解
一、socket函数
1、头文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
2、函数原型:
int socket(int domain, int type, int protocol);
socket函数类似于open,用来打开一个网络连接,如果成功则返回一个网络文件描述符(int类型),之后我们操作这个网络连接都通过这个网络文件描述符。
dimain:域,网络域,网络地址范围(IPV4或IPV6等),也就是协议簇
type:指定套接字类型:SOCK_STREAM(TCP网络)、SOCK_DGRAM(UDP)、SOCK_SEQPACKET
protocol:指定协议,如果指定0,表示使用默认的协议
3、函数形参:
3.1、domain:(域)
AF_INET ip
AF_INET6 ipv6
AF_PACKET packet 低级数据包接口
PF_PACKET 不懂,待了解
PF_INET 待了解(AF开头的表示地址族,PF开头的表示协议族,协议族包含多个地址族,但是当前这种还从未实现,而在<sys/socket.h>中PF的值总是与AF的值相等的)
3.2、type:(套接字类型):
SOCK_RAW 原始套接字 ——>使用原始套接字时候调用,原始套接字也就是链路层协议
SOCK_STREAM 字节流套接字 ——>提供顺序,可靠,双向,基于连接的字节流。 可以支持带外数据传输机制。例如:TCP协议、FTP协议
SOCK_DGRAM 数据报套接字 ——>支持数据报(无连接,不可靠的固定最大长度的消息)例如:UDP协议
SOCK_SEQPACKET 有序分组套接字 ——>为固定最大长度的数据报提供有序,可靠,双向连接的数据传输路径; 消费者需要利用每个输入系统调用读取整个分组
3.3、protocol(协议):
IPPROTO_IP IP传输协议
IPPROTO_TCP TCP传输协议
IPPROTO_UDP UDP协议
IPPROTO_SCTP SCTP传输协议
IPPROTO_ICMP ICMP协议
IPPROTO_IGMP IGMP协议
一般情况下IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP协议用的最多,UDP协议protocol就取IPPROTO_UDP,TCP协议protocol就取IPPROTO_TCP;一般情况下,我们让protocol等于0就可以,系统会给它默认的协议。但是要是使用raw socket协议,protocol就不能简单设为0,要与type参数匹配.
4、返回值:
成功时返回一个小的非负整数值,他与文件描述符类似,我们称为套接字描述符,简称sockfd。失败,则返回-1。
5、例子:
g_ulDevRawSock = socket( PF_PACKET, SOCK_RAW, htons(ETH_DEV) ); //#define ETH_DEV 0x8607
iFd = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
fd = socket(PF_INET, SOCK_DGRAM, 0);
dnc_socket = socket(AF_INET, SOCK_STREAM, 0);
pupdate_info->update_socket = socket(PF_PACKET, SOCK_RAW, htons(0x8505)
二、connect函数
1、头文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
2、函数原型:
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
TCP客户端通过connect函数与服务端连接,进行通信。
3、函数形参:
3.1、sockfd(客户端自己创建的sock)
3.2、addr(服务端地址族、服务端IP地址、服务端端口号)
3.3、addrlen(服务端地址字节长度)
4、返回值:
连接成功,返回0,连接失败,返回-1
5、例子:
seraddr.sin_family = AF_INET; // 设置地址族为IPv4
seraddr.sin_port = htons(SERPORT); // 设置地址的端口号信息
seraddr.sin_addr.s_addr = inet_addr(SERADDR); // 设置IP地址
ret = connect(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));
三、bind函数
1、头文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
2、函数原型:
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
服务端套接字绑定自己的IP地址与端口号,客户端那边可以不写,内核会给它分配一个临时的端口。
3、函数形参:
3.1、sockfd:服务器或者客户端自己创建的socket
3.2、addr:服务器或者客户端自己的地址信息(协议族、IP、端口号)
3.3、addrlen:服务器或者客户端自己的地址信息的长度
4、返回值:
绑定成功,返回0,失败返回-1
5、例子:
seraddr.sin_family = AF_INET; // 设置地址族为IPv4
seraddr.sin_port = htons(SERPORT); // 设置地址的端口号信息
seraddr.sin_addr.s_addr = inet_addr(SERADDR); // 设置IP地址
ret = bind(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));
(十一)socket、connect、bind函数详解的更多相关文章
- c/c++ 标准库 bind 函数 详解
标准库 bind 函数 详解 bind函数:接收一个函数名作为参数,生成一个新的函数. auto newCallable = bind(callbale, arg_list); arg_list中的参 ...
- jQuery.bind() 函数详解
bind()函数用于为每个匹配元素的一个或多个事件绑定事件处理函数. 此外,你还可以额外传递给事件处理函数一些所需的数据. 执行bind()时,事件处理函数会绑定到每个匹配元素上.因此你使用bind( ...
- 《Javascript高级程序设计》读书笔记之bind函数详解
为什么需要bind var name = "The Window"; var object = { name: "My Object", getNameFunc ...
- bind函数详解(转)
var name = "The Window"; var object = { name: "My Object", getNameFunc: function ...
- windows socket函数详解
windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...
- c/c++ socket函数详解
c/c++ socket函数详解 注意: 使用socketAPI前,要先将相关链接库(Ws2_32.lib)加入链接,并使用WSAStartUp函数初始化.每个socket函数都可能失败(返回-1), ...
- 常用socket函数详解
常用socket函数详解 关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄 ...
- linux Socket send与recv函数详解
转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include ...
- linux select函数详解
linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...
随机推荐
- 夺命雷公狗----Git---5---分支
git分支的概念相当于是添加一个属于自己的分支,别人是看不到的,等你写完自己的程序到时候在合并到团队的分支上即可.... 我们可以查看自己git里面有什么分支,如下所示: git branch 在这里 ...
- SQL Server 2008连接字符串写法大全
一..NET Framework Data Provider for SQL Server 类型:.NET Framework类库使用:System.Data.SqlClient.SqlConnect ...
- ASP.NET导出文件FileResult的使用
本文给大家讲一下ASP.NET MVC中如何使用FileResult来导出文件,首先网上相关例子有很多大神都有讲,我在这只是稍微说一点不同——为什么我的导出没有反应呢? 这个问题,我找了半天也没有找到 ...
- JVM内存管理
前几天公司的郑大晔校上,XXX同事做了JVM的Session,于是趁端午节放假的功夫,研究了一些JVM相关的知识. 在Java生态系统中,JVM占据至关重要的作用,就像一个适配器,它向编程语言(主要是 ...
- SQL2008完全卸载详解(图解)
一. SQL2008卸载. 1.从控制面板卸载 1)点击计算机右下角“开始”,点击“控制面板”
- 6. Samba服务和防火墙配置笔记
Samba文件服务器 (一)简介 内网文件服务器 windows-windows 文件共享服务 网络邻居linux-linux NFS windows-linux Samba (二)端口 smbd: ...
- redis.conf配置详细翻译解析
# redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...
- PRINCE2项目管理七大流程之指导流程
PRINCE2项目管理七大流程之指导流程 今天学习七大流程之二--项目指导流程 项目指导流程的目的就是使项目管理委员会能够对项目的成功负责,具体来说,是由项目管理委员会作出关键决策,并进行总体控制 ...
- ping命令脚本实现显示网络状态、学生姓名、学号
#!/bin/bash a=. ####定义一个固定变量 h=(wanghao xieyunshen 刘桃) ####定义数组 ..} ####for循环,后面的in是条件即从多少循环到多少 do # ...
- windows平台整合Apache与tomcat
Apache与Tomcat整合的好处 Apache主要用来解析静态文本,如html.Tomcat虽然也有此功能,但Apache效率大大高于Tomcat,尤其是对于并发数较大的企业级应用,能更好的显示A ...