一、套接字的地址结构.

IPV4套接字地址结构通常也称为"网际套接字地址结构",它以sockaddr_in

命名;POSIX定义如下:

#include

struct in_addr

{

unsigned long s_addr; /*32-bit IPv4 address

network byte ordered*/

};

/*socketaddr结构体一般是一般是用作参数来使用,指明地址信息*/

struct sockaddr

{

unsigned short sa_family;/*address family,AF_XXX*/

char sa_data[14];/*14bytes of protocol address*/

};

/*sa_family是地址家族,一般都是"AF_XXX"的形式.*/

/*sa_data是14字节协议地址.sockaddr此结构体不作为操作的对象

而是用作bind,connect,recvfrom,sendto函数的参数,指明地址信息.*/

struct sockaddr_in

{

short sockaddr_in; /*Address family*/

unsigned short sin_port;/*Port number*/

struct in_addr sin_addr; /*Internet address*/

unsigned char sin_zero[8];/*Same size as struct sockaddr*/

};

/*

sin_family指定协议族,在socket编程中只能是AF_INET.

sin_port存储端口号(一般和htons配合使用转换为网络字节顺序)

sin_addr存储IP地址,使用in_addr这个数据结构.

sin_zero是为了让sockadr和sockaddr_in两个数据结构保持大小相同而

保留的空字节.

*/

int main(void)

{

/*大小是一样的.*/

printf("sizeof(sockaddr_in) = %d,sizeof(sockaddr) = %d\n",

sizeof(struct sockaddr_in),sizeof(struct sockaddr));

return 0;

}

1.主机字节序和网络字节序之间的转换函数

unsigned short htons(unsigned short host16bit);

unsigned  long  htonl(unsigned long host32bit);返回网络字节序的值.

unsigned short ntohs(unsigned short net16bit);

unsigned long  ntohl(unsigned long net32bit);

返回主机字节序的值.

h代表host,n代表network,s代表short,l代表long.

2.字节操作函数

#include

void bzero(void* dest,size_t nbytes);

void bcopy(const void* src,void* dest,size_t nbytes);

int  bcmp(const void* ptrl,const void* ptr2,size_t nbytes);

bzero把目标字节字符串中指定数目的字节置成0.我们经常使用该函数来把

一个套接字地址结构初始化为0.

bcopy将指定数据的字节从源字节串移动到目标字节串.

bcmp比较两个任意的字节串,若相同则返回0,否则返回为非0.

ANSI C函数

#include

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);

memset把目标指定数据的字节置为值c,memcpy类似bcopy

不过两个指针参数的顺序是相反的.

当源字节串与目标字节串重叠的时候,bcopy能正确处理,但是

memcpy的操作结果是未知的.这种情形之下必须改用ANSI C

下的memmove.

3.地址转换函数

int  inet_aton(const char* strptr,struct in_addr* addrptr);

字符串有效则返回1,否则为0;

将strptr所指的C字符串转换成一个32位的网络字节序的二进制,

并通过指针addrptr来存储.若成功返回1,失败0

char* inet_ntoa(struct in_addr inaddr);

指向一个点分十进制数串的指针.

in_addr_t inet_addr(const char* strptr);

若字符串有效则为32位二进制网络字节序的IPV4地址,

否则为INADDR_NONE;

char* inet_ntoa(struct in_addr  inaddr);

返回一个点分十进制串的指针.

地址之间转换比较统一的函数:

#include

int  inet_pton(int family,const char* strptr,void* addrptr);

若成功返回1,若输入不是有效的表达式则为0,出错返回-1.

const char* inet_ntop(int family,const void* addrptr,char* srptr,size_t len);

若成功则为指向结果的指针,若出错则为NULL。

二、基本TCP套接字编程.

1.创建socket描述符.

int socket(int family,int type,int protocol);

//若成功则为非负描述符,若出错则为-1.

family参数指明协议族,AF_INET,AF_LOCAL,AF_INET6

type指的是字节顺序,一般是SOCK_STREAM数据流,和SOCK_DGREAM数据报.

SOCK_SEQPACKET 有序分组套接子,SOCK_RAW原始套接字.

protocol   IPPROTO_CP     TCP传输协议

IPPROTO_UDP    UDP传输协议

IPPROTO_SCTP   SCTP传输协议

2.TCP客户用connect函数来建立与TCP服务器的连接.

int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);

若成功返回0,若出错返回-1.

sockfd是由socket函数返回的套接字描述符,第二个第三个参数

分别是执行套接字的地址结构的指针和该指针的大小.

客户在调用函数connect前不必非要调用bind函数,因为如果需要的话,

内核会确定源IP地址,并选择一个临时端口作为源端口.

如果是TCP套接字,调用connect函数将激发TCP的三路

握手过程,而且仅当连接建立成功或出错的时候才返回,其中出

TCP状态转换图,connect函数导致当前套接字从CLOSED状态

(该套接字由socket函数创建以来一致所处的状态)转移到

SYN_SENT状态,若成功则再转移到ESTABLISHED状态.

3.int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen);

第二个参数是一个指向特定于协议的地址结构的指针,第三个参数是该地址结构的长度.

一般用于服务器的把地址和端口绑定起来,如果一个TCP客户或服务器

未曾调用bind捆绑一个端口,当调用connect或linsten时,内核就要为相应的

套接字选择一个临时端口.

4.int listen(int sockfd,int backlog);

listen函数仅由TCP服务器调用,它做两件事情.

a.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,

它是一个将调用connect发起连接的客户套接字.listen函数把一个未连接的套接字转换

成一个被动套接字,指示内核应接收执行该套接字的连接请求.根据TCP状态图,调用

listen导致套接字从CLOSED状态转换到LISTEN状态.

b.本函数的第二个参数规定了内核应该为相应套接字排队的最大连接数.

成功返回0,失败返回-1.

5.accept函数由TCP服务器调用,用于从已经完成连接队列队头返回下一个已完成连接.

如果已完成连接队列为空,那么进程被投入睡眠(假定套接字为默认的阻塞方式)

int accept(int sockfd,struct sockaddr* cliaddr,socklen_t* addrlen);

cliaddr和addrlen用来返回已经连接的对端进程(客户)的协议地址.addrlen是值-结果参数

成功返回非负描述符,出错返回-1.

如果accept成功,则返回值是由内核自动生成的一个全新描述符,代表与所返回客户的

TCP连接.在讨论accept函数时,我们称它的第一个参数为监听套接字描述符,称它的返回

值为已经连接的套接字描述符.一个服务器通常仅仅创建一个监听套接字,它在该服务器

的生命周期内一直存在.内核为每个由服务器进程接收的客户连接创建一个已连接套接

字.当服务器完成对某个给定客户的服务时,相应的已经连接套接字就会被关闭.

6.fork()函数

pid_t  fork(void);

在子进程中为0,在父进程中为进程ID,出错返回-1.

函数特定:

该函数调用一次,返回两次.

来源:https://www.cnblogs.com/yasanlun/p/3854264.html

网络编程步骤linux,Linux网络编程的一般步骤(1)相关推荐

  1. Linux下网络编程

    Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...

  2. linux网络编程(一)网络基础传输知识

    linux网络编程(一)网络传输基础知识 一.什么是协议? 二.使用步骤 典型协议 2.网络应用程序设计模式 C/S模式 B/S模式 优缺点 3.分层模型 4.TCP/IP四层模型 通信过程 5.协议 ...

  3. 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记

    文章目录 第1章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 1.1.1 线程安全的定义 1.1.3 线程安全实例 1.2 对象的创建很简单 1.3 销毁很难 1.4 线程安全的Obser ...

  4. Linux Socket网络编程UDP、TCP 阻塞与非阻塞 断线重连机制

    三种非阻塞模式的方法: (1) fcntl函数 int Mode = fcntl(sockfd, F_GETFL, 0);       //获取文件的Mode值     fcntl(sockfd, F ...

  5. linux系统/网络编程

    经典数据: APUE:unix环境高级编程3版 linux系统编程手册 德 linux系统编程 oreily unix内核源码剖析 日 windows核心编程 linux系统开发模式: ssh远程登录 ...

  6. 【Linux】网络基础+UDP网络套接字编程

    只做自己喜欢做的事情,不被社会和时代裹挟着前进,是一件很奢侈的事. 文章目录 一. 网络基础 1.局域网和广域网 2.协议初识和网络协议分层(TCP/IP四层模型) 3.MAC地址和IP地址(子网掩码 ...

  7. Linux C高级编程——网络编程之API(5)

    Linux C网络编程--API 宗旨:技术的学习是有限的,分享的精神的无限的.          一.基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的.网络的so ...

  8. Linux C高级编程——网络编程基础(1)

    Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神是无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是因为TCP/IP包含T ...

  9. Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)

    Linux操作系统网络编程--原始套接字 (1) http://soft.zdnet.com.cn/software_zone/2007/1020/568223.shtml 我们在前面已经学习过了网络 ...

  10. 嵌入式Linux系统编程学习之三十三网络相关概念

    文章目录 一.网络相关名词的概念 1.套接口 2.端口号 3.IP 地址 二.Socket 概念 三.Socket 类型 四.Socket 的信息数据结构 五.数据存储优先顺序的转换 六.地址转格式转 ...

最新文章

  1. 新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死——原因与解决方案
  2. 一个专业处理字符串的IDEA插件
  3. 一個傳統的C2C網站的用戶充值的过程
  4. [Skill]-Markdown编辑器技巧
  5. ioc spring 上机案例_抛开Spring去理解IOC思想 - 原来IOC容器这么简单
  6. Python数模笔记-PuLP库(1)线性规划入门
  7. C++_结构体指针_嵌套结构体_结构体做为函数参数_结构体值传递和指针传递---C++语言工作笔记026
  8. HALCON:Optical Flow(光流)
  9. 2016年开源软件排名TOP50,最受IT公司欢迎的50款开源软件
  10. win2008server R2 x64 部署.net core到IIS--ASP .NET Core HTTP Error 502.5 – Process Failure
  11. ubuntu wiznote 无法显示内容 只有标题
  12. 什么是scrum敏捷项目管理
  13. 13个适合上班时做的保健小动作
  14. 接着说tableview的tableheadview
  15. 构造-牛客寒假集训营3-牛牛的DRB迷宫II
  16. 一级网站域名与二级域名的区别,如何注册网站一级域名
  17. Scrapy框架采集微信公众号数据,Python大佬机智操作绕过反爬验证码
  18. MySQL 简单查询记录(二)
  19. 毕业设计-基于大数据的股票预测系统-python
  20. 汇川PLC编程软件AutoShop的使用

热门文章

  1. leetcode系列--454.四数之和Ⅱ
  2. 河南大学的建立与拆分史
  3. 25000字总结Android优秀的第三方框架、各种学习资料汇集 一 系统组件、Design组件、自定义组件等等
  4. python像数常用函数_10个好用的Python集成开发环境【大牛经验】
  5. Cisco路由器基本操作
  6. 使用sqlserver2008时找不到配置管理器
  7. pip使用清华源 安装opencv
  8. f4v格式视频转换成MP4格式的方法
  9. MUI学习之路---了解MUI,MUI的第一个项目和页面的跳转
  10. mui实现上下滑动控制显隐效果