UNPv13:#第3章#套接字编程简介

IPv4套接字地址结构

POSIX规范只要求3个字段:sin_family、sin_addr和sin_port。

#include <netinet/in.h>  

struct sockaddr_in  
{  
    uint8_t         sin_len;  
    sa_family_t     sin_family;  
    in_port_t       sin_port;  
    struct in_addr  sin_addr;  
    ...  
}; 

通用套接字地址结构

#include <sys/socket.h>

struct sockaddr
{
    uint8_t      sa_len;
    sa_family_t  sa_family;
    char         sa_data[14];
};

字节排序程序

术语“小端”和“大端”表示多个字节值的哪一端存储在该值的起始地址。网际协议使用大端字节序来传送这些多字节整数。

#include <netinet/in.h>

uint16_t htons(uint16_t host16bitvalue);  
uint32_t htonl(uint32_t host32bitvalue);  
uint16_t ntohs(uint16_t net16bitvalue);  
uint32_t ntohl(uint32_t net32bitvalue); 

在那些与网际协议所用的大端字节序相同的系统中,这四个函数通常被定义为空宏。

inet_aton、inet_addr和inet_ntoa函数

#include <arpa/inet.h>  

int inet_aton(const char* strptr, struct in_addr* addrptr);//字符串有效返回1,否则为0
in_addr_t inet_addr(const char* strptr);//字符串有效返回网络字节序的32位IPv4地址,否则为INADDR_NONE
char* inet_ntoa(struct in_addr inaddr);//指向一个点分十进制数串的指针

inet_pton和inet_ntop函数

#include <arpa/inet.h> 

int inet_pton(int family, const char* strptr, void* addrptr);//成功:1;输入格式无效:0;出错:-1
const char* inet_ntop(int family, const void* addrptr, char* strptr, size_t len);//失败:NULL;成功:结果
#include <netinet.in.h>

#define INET_ADDRSTRLEN 16

注意

字节流套接字上调用read或write输入或输出的字节数可能比请求的数量少,原因在于套接字的缓冲器可能已经达到了极限,需要再次调用read或write输入或输出剩余的字节。对于文本行交互的应用来说,程序应该按照操作缓冲区来编写。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)(A.思维题,B.思维题)

A. Vicious Keyboard time limit per test:2 seconds memory limit per test:256 mega...

3097
来自专栏编程

30个基本的Python技巧和窍门程序员

1.就地交换两个数字。 Python提供了一种直观的方式来分配和交换一行。请参考下面的例子。 x,y = 10,20print(x,y) x,y = y,xpr...

1887
来自专栏学习力

《Java从入门到放弃》JavaSE入门篇:程序结构 推荐

1444
来自专栏窗户

awk的递归

  想来惭愧,之前写的一篇文章《用awk写递归》里多少是传递了错误的信息。虽然那篇文章目的上是为了给出一种思路,但实际上awk是可以支持函数局部变量的。

642
来自专栏数据结构与算法

10:判决素数个数

10:判决素数个数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y...

3196
来自专栏小樱的经验随笔

浅谈String模块ascii_letters和digits

本文介绍string模块ascii_letters和digits方法,其中ascii_letters是生成所有字母,从a-z和A-Z,digits是生成所有数字...

3337
来自专栏黄Java的地盘

WebSocket系列之字符串如何与二进制数据间进行互相转换

上一篇博客我们说到了如何进行数字类型(如Short、Int、Long类型)如何在JavaScript中进行二进制转换,如果感兴趣的可以可以阅读本系列第二篇博客—...

231
来自专栏我有一个梦想

CI学习 CCNET Config 第一天

CCNet的整体结构就是一个Xml文档,根元素就是cruisecontrol,具体的代码块如下所示: <cruisecontrol xmlns:cb="urn...

1906
来自专栏遊俠扎彪

Linux内核代码中max和min宏的实现以及语句表达是({})的应用

Linux内核代码中有很多比较精巧的程序设计技巧,include/linux/kernel.h中实现max和min宏就是其中的一部分。

1915
来自专栏C语言及其他语言

【每日一题】问题 1209: 密码截获

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码 进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一...

1192

扫描关注云+社区