UNIX 网络编程笔记-CH3:套接字编程简介
IPv4套接字地址结构
struct in_addr {
in_addr_t s_addr;
};
struct sockaddr_in {
uint8_t sin_len; /* length of structure (16) bytes */
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 16-bit TCP/UDP port, network byte order(big-endian) */
struct in_addr sin_addr; /* 4-byte IPv4 address, network byte */
char sin_zero[]; /* unused */
}
共16字节,编程时需要设置的一般就是sin_family, sin_port, sin_addr这三个字段。因为这是IPv4对应的套接字地址结构体所以有sin_family=AF_INET,后两个字段需要通过换转函数把本机字节序的值变为网络字节序(大端)。
通用套接字地址结构
套接字接口除了处理IPv4对应的套接字地址结构外,还需要支持其他各种套接字地址结构,如IPv4,Unix套接字等。所以在void*指针类型尚未出现前,定义了一个通用套接字结构体:
struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[];
};
相应的各套接字函数的地址参数都使用了struct sockaddr*类型的参数,使用时把各个类型的套接字地址结构体指针都强制转换为struct sockaddr*,这样单个套接字函数可以根据sa_family和长度复制数据并对不同类型的套接字分别处理了。如bind函数:
int bind(int sockfd, struct sockaddr* addr, socklen_t len);
套接字地址参数值传递
从进程向内核传递套接字地址的函数有:
1. bind(int fd, struct sockaddr* addr, int addrlen)
2. connect(int fd, struct sockaddr* addr, int addrlen)
3. sendto
从内核到进程传递套接字地址的函数有:
1. accept(int fd, struct sockaddr* addr, int* len),len在调用时向内核指明地址结构大小,在返回时指明实际存储的数据大小
2. recvfrom
3. getsockname
4. getpeername
字节序转换函数
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
h-host, n-network, s-short, l-long int==>int
地址字符与数值转换
IPv4地址可以使用点分十进制也可以使用直接的数值(网络序),书中推荐使用下面两个函数进行转化
#include <arpa/inet.h> int inet_pton(int family, const char* str, void* addrptr); const char* inet_ntop(int family, const void* addptr, char* strbuf, size_t len);
对于IPv4来说addrptr应该取sockaddr_in.sin_addr的地址,常用的类似功能的函数有
#include <arpa/inet.h> 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);
UNIX 网络编程笔记-CH3:套接字编程简介的更多相关文章
- Python黑帽编程2.8 套接字编程
Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...
- 【Unix网络编程】chapter3套接字编程简介
chapter3套接字编程简介3.1 概述 地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换.多数现存的IPv4代码使用inet_addr和inet_ntoa这两个函数, ...
- 【Unix网络编程】chapter3 套接字编程简介
chapter3套接字编程简介3.1 概述 地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换.多数现存的IPv4代码使用inet_addr和inet_ntoa这两个函数, ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- UNIX网络编程——基本TCP套接字编程
一.基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的 ...
- <网络编程>基本TCP套接字编程
tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...
- 31_网络编程(Socket套接字编程)_讲义
今日内容介绍 1.网络三要素及传输协议 2.实现UDP协议的发送端和接收端 3.实现TCP协议的客户端和服务器 4.TCP上传文件案例 01网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用 ...
- Linux网络编程:原始套接字简介
Linux网络编程:原始套接字编程 一.原始套接字用途 通常情况下程序员接所接触到的套接字(Socket)为两类: 流式套接字(SOCK_STREAM):一种面向连接的Socket,针对于面向连接的T ...
- Python套接字编程(1)——socket模块与套接字编程
在Python网络编程系列,我们主要学习以下内容: 1. socket模块与基本套接字编程 2. socket模块的其他网络编程功能 3. SocketServer模块与简单并发服务器 4. 异步编程 ...
随机推荐
- ListOrderedMap与Map的区别
ListOrderedMap位于commons-collections的jar包里,与普通的map相比,ListOrderedMap的key可保持原有顺序,在某些情况比如做报表的时候,非常实用. 代码 ...
- Linux下配置环境变量的几个方法实例
场景:一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录 ...
- C#-WebForm-★ASP.NET中的母版页★
何为母版页,顾名思义母版就是模版,就像在PPT里面的板式或主题一样,大框架已经有了,我们的任务就是向里面添加具体的内容.这样我们制作的所有幻灯片的外观大体都是一样的. 在ASP.NET中母版页有两种作 ...
- jQuery EasyUI Datagrid组件的完整的基础DOM结构
标题可能有点长,什么叫“完整的基础DOM结构”,这里“基础”的意思是指这个结构不依赖具体数据,不依赖Datagrid的view属性,只要存在Datagrid实例就会存在这样的基础DOM结构:而“完整” ...
- Carte作为Windows服务
有一些用例将Carte作为Windows服务运行: 当使用命令窗口运行Carte实例时,任何人都会错误地关闭实例并且Carte将关闭. Carte.bat命令窗口与调用批处理文件的用户会话相关联,需要 ...
- HDU - 6096 处理后缀的字典树
题意:给定n个字符串,m次询问,每次询问多少个字符串前缀是pre且后缀是suf,前后缀不可相交 字典树同时存储前后缀,假设字符串长为len则更新2*len个节点,依次按s[0],s[len-1],s[ ...
- 在Windows Server 2008 R2(x64)上安装.NET Framework 4.5 兼谈.NET Framework 4.0 “在服务器核心角色上不受支持”含义
完成了一个服务器文件监控系统,该系统的核心是一个Windows服务,需要安装在服务器上.由于是Visual Studio 2012开发,为了保证开发的Windows服务可以运行,必须在Windows服 ...
- (转)drbd详解
原文:http://blog.csdn.net/u014421556/article/details/52925442
- Wrapper配置详解及高级应用(转)
转自:http://286.iteye.com/blog/1921414 将一个简单的程度如HelloWorld 的应用包装秤Wrapper 服务并不复杂,甚至可以认为非常简单.但是实际项目应用过程中 ...
- JDBC处理Transaction
package com.ayang.jdbc; import java.sql.*; /** * transaction的构成,随便写一句insenrt,一执行executeUpdate(),它自动提 ...