注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

《深入理解计算机系统》笔记(七)  

2014-09-29 15:26:45|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

十一、网络编程

1、因特网的客户端和服务器混合使用套接字接口函数和UNIX I/O函数进行通信。这里的客户端和服务器是指进程。

2、IP地址结构:

struct in_addr{

unsigned int s_addr;

};

3、网络字节顺序转换:

#include <netinet/in.h>

unsigned long int htonl(unsigned long int hostlong);//32整数由主机字节顺序转换为网络字节顺序

unsigned long int htons(unsigned long int hostlong);//16整数由主机字节顺序转换为网络字节顺序

unsigned long int ntoal(unsigned long int netlong);//32整数由网络字节顺序转换为主机字节顺序

unsigned long int ntoas(unsigned long int netlong);//16整数由网络字节顺序转换为主机字节顺序

4、IP地址和点分十进制串转换:

#include <arpa/inet.h>

int inet_aton(const char *cp,struct in_addr *inp);//参数为指向结构的指针

//将点分十进制串cp转换为IP地址inp,成功返回1,出错则返回0

char *inet_ntoa(struct in_addr in);//参数为结构本身

//IP地址转换为十进制串,返回指向十进制串的指针

5、域名结构:

struct hostent{

char *h_name;

char **h_aliases;

char h_addrtype; //AF_INET

char h_length;

char **h_addr_list;

}

从域名系统(DNS)数据库中检索主机的函数:gethostbyname()gethostbyaddr()

#include <netdb.h>

struct hostent *gethostbyname(const char *name);

//返回和域名name相关的主机条目,成功为非NULL指针,出错为NULL,同时设置h_errno

struct hostent *gethostbyaddr(const char *addr,int len,0);

//返回和IP地址addr相关的主机条目,成功为非NULL...lenIP地址的长度

6、套接字接口

2014年09月29日 - mihooke - mihooke的博客

我们来解释下这张表,也就是socket的连接过程。连接过程大致可以分为3步:客户端请求、服务器监听、连接确认。

客户端请求:客户端的套接字利用socket函数建立连接,并用connect函数发送连接到目标服务器,其中发送的整个套接字要包含目标服务器的地址和端口号,上述过程我们用open_clientfd包装函数来描述客户端的请求动作。

服务器监听:服务器实时监听来自客户端的套接字,这个过程调用bind函数会发生阻塞,如果收到来自客户端的请求,则回应。上述过程用open_listenfd函数包装函数来描述服务期短的动作。

连接确认:当服务器端监听到来自客户端的请求之后,就响应客户端请求,建立一个新的线程,把服务器端的套接字描述符发送给客户端,一旦客户端确认了此描述,连接就建立好了。那么服务器端则继续等待来自下一个客户端的连接请求。期间会用到RIO函数去处理发送的描述符。

7套接字地址结构

struct sockaddr {

unsigned short sa_family;

char     sa_data[14];

};

struct sockaddr_in {

unsigned short sin_family;

unsigned short sin_port;

struct in_addr sin_addr;

unsigned char sin_zero[8];

};

typedef struct sockaddr SA;

8、socket函数,创建一个套接字描述符

#include <sys/types.h>

#include <sys/socket.h>

int socket(int domain, int type, int protocol);//返回非负描述符

可以这样调用socket函数:

clientfd = socket(AF_INET, SOCK_STREAM, 0);

AF_INET表示正在使用的因特网,SOCK_STREAM表示这个套接字是因特网连接的一个端点。此时,文件只是打开状态,还不能用于读写。

connect函数,建立和服务器的连接

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);//成功返回0

connect函数视图与套接字地址为serv_addr的服务器建立一个连接,addrlensizeof(sockaddr_in)connect函数会阻塞,直到连接成功。

 

可以把socketconnect函数包装成一个open_clientfd函数,被客户端使用:

int open_clientfd(char *hostname, int port);//它和运行在hostname主机上的服务器建立连接,并在端口port上监听连接请求,返回一个套接字描述符。

9、bind函数,服务器与描述符联系起来

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

bind函数告诉内核将my_addr中的服务器套接字地址和套接字描述符sockfd联系起来。

listen监听套接字函数

int listen(int sockfd, int backlog);

服务器调用listen将从客户端请求过来的sockfd转换为监听套接字。backlog参数暗示了内核在开始拒绝连接请求之前,应该放入队列中等待未完成的连接请求数量。

 

可以把socketbindlisten函数包装成open_listenfd函数,被服务器使用,监听描述符。

int open_listenfd(int port);

打开和返回一个监听描述符,在port端口上接收连接请求。

10、accept函数,等待来自客户端的连接请求

int accept(int listenfd, struct sockaddr *addr, int *addrlen);

它等待来自客户端的连接请求到达监听描述符listenfd,然后再addr中填写客户端的套接字地址,并返回一个已连接描述符connfd,这个描述符可被利用UNIX I/O函数与客户端通信。

  评论这张
 
阅读(154)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017