程序员人生 网站导航

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP serv

栏目:综合技术时间:2014-09-30 05:39:05


1  Socket编程

socket这个词可以表示很多概念:

TCP/IP协议中,“IP地址+TCPUDP端口号”唯一标识网络通讯中的一个进程,“IP

地址+端口号”就称为socket

TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。socket本身有“插座”的意思,因此用来描述网络连

接的一对一关系。

TCP/IP协议最早在BSD UNIX上实现,为TCP/IP协议设计的应用层编程接口称为socket

API

本章的主要内容是socketAPI,主要介绍TCP协议的函数接口,最后介绍UDP协议和UNIX Domain Socket的函数接口。

11.1socketAPI

2 网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的

多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,

那么如何定义网络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。

    TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。例如上一节的UDP

段格式,地址0-116位的源端口号,如果这个端口号是10000x3e8),则地址00x03

地址10xe8,也就是先发0x03,再发0xe8,这16位在发送主机的缓冲区中也应该是低地址存0x03,高地址存0xe8。但是,如果发送主机是小端字节序的,这16位被解释成0xe803,而不是1000。因此,发送主机把1000填到发送缓冲区之前需要做字节序的转换。同样地,接收主机如果是小端字节序的,接到16位的源端口号也要做字节序的转换。如果主机是大端字节序的,发送和接收都不需要做转换。同理,32位的IP地址也要考虑网络字节序和主机字节序的问题。

 

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

3 函数介绍

A 依赖的头文件

#include <arpa/inet.h>

B 函数声明

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

h表示hostn表示networkl表示32位长整数,s表示16位短整数。

如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。

 

uint32_t htonl(uint32_t hostlong);

名称:

htonl

功能:

The htonl() function converts the unsigned integer hostlong  from  host byte order to network byte order

头文件:

#include <arpa/inet.h>

函数原形:

uint32_t htonl(uint32_t hostlong);

参数:

 

返回值:

 

 

uint16_t htons(uint16_t hostshort);

名称:

htons

功能:

The htons() function converts the unsigned short integer hostshort from

host byte order to network byte order.

头文件:

#include <arpa/inet.h>

函数原形:

uint16_t htons(uint16_t hostshort);

参数:

 

返回值:

 

 

uint32_t ntohl(uint32_t netlong);

名称:

ntohl

功能:

The ntohl() function converts the unsigned integer netlong from network

byte order to host byte order.

头文件:

#include <arpa/inet.h>

函数原形:

uint32_t ntohl(uint32_t netlong);

参数:

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐

1森海塞尔及诺音曼将亮相第30届北京国际广播电影电视展览会 2微信小程序全套使用指南 3ADB环境变量配置(解决一些插件不能使用的问题,例如Genymotion、自带的UI查看器等) 4Android接口和框架学习 5微信小程序上手篇(3) 6机器学习:利用卷积神经网络实现图像风格迁移 (二) 7细聊 Cocoapods 与 Xcode 工程配置