套接字结构

套接字编程简介

最近在看《UNIX网络编程卷一》,算是写的读书笔记吧.

IPv4套接字地址结构

IPv4套接字地址结构定义在 < netinet/in.h > 头文件中.它以 sockaddr_in 命名.下面是它的结构体:

struct in_addr {in_addr_t       s_addr;             32位IPv4地址,网络字节序
};struct sockaddr_in {uint8_t         sin_len;sa_family_t     sin_family;         协议类型in_port_t       sin_port;           端口号struct in_addr  sin_addr;           char            sin_zero[8];
}
  • 结构体中的sin_len通常是不用设置的,它存在的目的是为了简化长度可变套接字地址结构的处理.
  • sin_zero[8]总是被设置为0.按照惯例,整个结构体都会被初始化为0,所以这个未曾使用的数组一般不用特意去管它.
  • 在结构体in_addr中的in_addr_t类型一般为 uint32_t ,而 in_port_t 通常为 uint16_t .

值-结果参数

本来这一部分的内容不多,但是我觉得这是一个很好的解决小问题的思路.于是单拿出来写一写.

当往一个套接字函数传递套接字地址结构的时候,结构总是以引用(也就是指针)的形式来传递,同时参数中还会指明该结构体的
长度.但是长度的传递方式则取决于传递的方向:从进程到内核或者从内核到进程.

  • 当长度是从进程传递到内核的时候,参数是结构体的整数大小,从而使内核知道到底要从进程复制多少数据,从哪复制数据进来.

  • 从内核到进程传递套接字地址结构的时候,参数则是指向结构体大小的指针.当函数被调用的时候,它的作用是告诉内核结构体的长度,
    以免内核在写结构体时越界.当函数返回的时候,结构大小的指针又是一个结果,它告诉进程,内核在该结构体中究竟存储了多少信息.

  • 这种类型的参数成为 值-结果参数.这个参数在被调用时和返回时代表着两个不同的含义.

字节操纵函数

Berkeley函数由于兼容性的问题早已经不推荐使用了,所以我也就不再介绍了.

    void *memset (void *dest,int c,size_t len);void *memcpy (void *dest,const void *src,size_t nbytes);int memcmp(const void *ptr1,const void *ptr2,size_t nbytes);

函数名写的比较明确,这三个函数分别是memory set,memory copy以及memory compare.所以就不详细讲了.

    int inet_aton(const char *strptr,struct in_addr *addrptr);in_addr_t inet_addr(const char *strptr);char *inet_ntoa(struct in_addr inaddr);
  • inet_aton : 将字符串转换为in_addr并存入我们传入的in_addr参数.
  • inet_addr : 将字符串转化为in_addr_t(也就是in_addr结构体中的内容类型),并将其返回.
    • inet_ntoa : 将结构体in_addr转化为字符串并返回.

需要注意的是,inet_aton中的第二个参数struct in_addr可以传入空指针,此时函数只会检查字符串的有效性,不会存储结果.

I/O读写函数

字节流套接字(例如TCP套接字)上的调用read或者write函数的时候得到的字节数可能会比请求的要少,这是由于套接字缓冲区已经满了的
原因.稍后我会再推荐一篇关于套接字缓冲区的内容.

在本书中还写了三个函数用来包装read,write和readline,目的就是为了解决读出的字节与请求字节不相同的问题.其中的关键点就是通过
重复调用函数,并且对函数的返回值加以判断,如果是0或者EINTR的话就继续循环,直到读出请求的字节数为止.

转载于:https://www.cnblogs.com/xinglong/p/5927629.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极乐科技CEO应邀出席2017微信小程序生态课

2019独角兽企业重金招聘Python工程师标准>>> 1月9日凌晨小程序正式上线。张小龙第一时间在其朋友圈写下一个日期—2007.1.9&#xff0c;并配上iPhone发布会的图片&#xff0c;微信小程序如约而至。在兴奋之际&#xff0c;极乐科技的大咖们也在思考&#xff1a;专注于…

蓝桥杯 基础练习 数列排序

http://lx.lanqiao.cn/problem.page?gpidT52 问题描述给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200输入格式第一行为一个整数n。第二行包含n个整数&#xff0c;为待排序的数&#xff0c;每个整数的绝对值小于10000。输出格式输出一行&…

php 禁用通知,推送消息能不能区分禁止通知和卸载两种类型?

消息推送ios用了apns&#xff0c;android用的是gcm。推送失败都会返回无效的token&#xff0c;但是无效的tokne中&#xff0c;能不能区分到哪些是禁止通知&#xff0c;哪些是卸载app导致的呢&#xff1f;1 APNS PHP 的推送返回错误处理Push.php if (!empty($aMessage[ERRORS]))…

IOS13图标尺寸_更新iOS13后,我的5台iPhone都废了

苹果就是自带热搜体质&#xff0c;特别是在九月。机哥大概数了一下&#xff0c;光是线下发售后的这四天&#xff0c;iPhone 11 前前后后就上了 7 次热搜。今天这一次热搜&#xff0c;是因为库克之前发了一条微博&#xff0c;夸自家 iPhone 11 是有史以来最出色的一款。在这条微…

Android 如何调用系统默认浏览器访问

// 调用系统默认浏览器// 参考&#xff1a;// http://www.cnblogs.com/zhwl/archive/2011/11/15/2249848.html// https://segmentfault.com/a/1190000003912694case R.id.tv_about_weibo: // 关于微博// 直接打开 // Intent intent new Intent(); // …

kotlin函数式编程_我最喜欢的Kotlin函数式编程示例

kotlin函数式编程by Marcin Moskala通过Marcin Moskala One of the great things about Kotlin is that it supports functional programming. Let’s see and discuss some simple but expressive functions written in Kotlin.Kotlin的一大优点是它支持函数式编程。 让我们看…

数据库收缩

1.选中数据库-任务-收缩-数据库 2.全部压缩 3.右键数据库&#xff0c;属性 4.找到自动收缩&#xff0c;设置为true 转载于:https://www.cnblogs.com/RogerLu/p/10469819.html

matlab自带kfcm函数,kfcmFun.m

function [center, U, obj_fcn] kfcmFun(data, cluster_n,maxit, kernel_b,expo)data_n size(data, 1); % 求出data的第一维(rows)数,即样本个数obj_fcn zeros(100, 1);% 初始化输出参数obj_fcnU initkfcm(cluster_n, data_n);% 初始化模糊分配矩阵,使U满足列上相加为1inde…

flink sql udf jar包_Flink 生态:一个案例快速上手 PyFlink

简介&#xff1a; Flink 从 1.9.0 版本开始增加了对 Python 的支持&#xff08;PyFlink&#xff09;&#xff0c;在刚刚发布的 Flink 1.10 中&#xff0c;PyFlink 添加了对 Python UDFs 的支持&#xff0c;现在可以在 Table API/SQL 中注册并使用自定义函数。PyFlink 的架构如何…

赛思互动:为什么越来越多的企业愿意接受SaaS服务?

SaaS是Software-as-a-Service&#xff08;软件即服务&#xff09;的简称&#xff0c;随着互联网技术的发展和应用软件的成熟&#xff0c; 在21世纪开始兴起的一种完全创新的软件应用模式。SaaS 应用软件的价格通常为“全包”费用&#xff0c;囊括了通常的应用软件许可证费、软件…

使用Google Cloud Platform分散您的应用程序

by Simeon Kostadinov通过Simeon Kostadinov 使用Google Cloud Platform分散您的应用程序 (Decentralize your application with Google Cloud Platform) When first starting a new software project, you normally choose a certain programming language, a specific frame…

pta通讯录排序用python实现,python实现将android手机通讯录vcf文件转化为csv

经常会遇到将手机通讯录导出到电脑并转化为在电脑中可编辑的情况&#xff0c;在网上搜索了很久当前不外乎两种处理方式。1.使用电脑的outlook的通讯簿功能&#xff0c;将手机导出的vcf文件导入到outlook的通讯录中&#xff0c;然后再导出为可编辑文件&#xff1b;2.是使用专用软…

从物联网发展历程看区块链挑战

2009年&#xff0c;中本聪发布了第一个比特币节点&#xff0c;五年后区块链俨然成为一个规模巨大的产业。 虽然看起来&#xff0c;基于区块链的新的商业时代距离我们似乎只有一步之遥&#xff0c;但在2016年&#xff0c;我们已经意识到区块链产业不会那么快获得成功。 早期的新…

编程软件python是什么意思_程序员Python编程必备5大工具,你用过几个?

Python是编程入门不错的选择&#xff0c;现在也有不少的程序员业余时间会研究这门编程语言。 学习Python有时候没有第一时间找到好工具&#xff0c;会吃不少的苦头。毕竟好的工具能将工作效率多倍速提升。下面W3Cschool给小伙伴们推荐Python编程必备的5大工具&#xff1a; 0、I…

Linux ReviewBoard安装与配置

目录 0. 引言1. 安装步骤2. 配置站点 2.1 创建数据库2.2 开始安装2.3 修改文件访问权限2.4 Web服务器配置2.5 修改django相关配置正文 回到顶部0. 引言 环境&#xff1a;Ubuntu 14.04 Server&#xff08;虚拟机&#xff09; 这篇文章里说的是review board官方的安装方式&#x…

小程序 graphql_GraphQL应用程序中的五个常见问题(以及如何解决)

小程序 graphqlby Sacha Greif由Sacha Greif GraphQL应用程序中的五个常见问题(以及如何解决) (Five Common Problems in GraphQL Apps (And How to Fix Them)) 了解如何释放GraphQL的强大功能而不会遭受缺点 (Learn to unlock the power of GraphQL without suffering its dr…

又拍云 php5月18号那,又拍云文档中心

移动流量平台概述又拍云手机流量营销平台&#xff0c;整合移动、电信、联通三大运营商流量资源&#xff0c;将强大的流量营销服务&#xff0c;通过接口等形式提供给商家合作伙伴&#xff0c;帮助商家开展品牌宣传、APP/游戏/微信公众号/网站的拉新与促活等多种营销活动。通过接…

SQL SERVER2000将多行查询结果拼接到一行数据及函数的创建

处理前的查询结果如上图&#xff1a; 通过借助SQL变量的定义 DECLARE Scope varchar(1000) DECLARE Num int SET Scope SET Num 1 SELECT ScopeScopeconvert(varchar(8),Num)、DescScope DescOper;, Num Num1 From fuel_contractQualityNew Where ContractID0120090001…

kindeditor简单使用

先引入&#xff1a; <script src"/static/jquery-3.3.1.min.js"></script><script src"/static/kindeditor-4.1.11-zh-CN/kindeditor/kindeditor-all.js"></script> 基本使用参数&#xff1a; $(function () {KindEditor.create(#…

windows nginx c++读取请求数据_轻松应对百万并发的Nginx,搞懂LinuxC/C++这些技术栈升职加薪...

在深入了解 Nginx 各种原理及在极端场景下的一些错误场景处理时&#xff0c;需要首先理解什么是网络事件。Nginx 是一个事件驱动的框架&#xff0c;所谓事件主要指的是网络事件&#xff0c;Nginx 每个网络连接会对应两个网络事件&#xff0c;一个读事件一个写事件。在深入了解 …