linux网络编程

网络基本原理:
五层协议模型:物理层,负责传输比特
数据链层 负责相邻设备间的通信
网络层 负责不同主机之间的通信
传输层 负责两台主机中进程之间的通信
应用层为应用进程提供服务
将不同地点的计算机,在网络软件的支持下,实现信息交换和共享的系统
Modem 将计算机的数字信号翻译成可沿线路传送的模拟信号。
网页浏览的工作原理?
电子邮件的工作原理?
网络协议的名陈?
什么是网络协议?
什么是端口号?
MAC是什么?
什么Socket? 描述IP地址和端口逻辑通信链的句柄。
什么是IP地址?Internet 主机作为路由寻址用的数字标识

传输层为相互通信的应用进程提供端到端的逻辑通信;
端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。
规定信息的格式以及如何发送和接受信息的一套规则。
网络中传输的二进制数据具体含义和作用的上下文

套接字=(IP+端口)
int socket(int family,int type, int protocol);
创建一个通过TCP/IP协议socket 返回描述符
1 协议族 AF-INET
2 类型
3 协议类型 0
int close(int socket);
关闭套接字

unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);

h表示host,n表示network,s表示short,l表示long

void * memset(void *dest, int ch, size_t len);

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

int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);

void bzero(void *dest, size_t nbytes);
等价于memset(dest, 0, nbytes);

int inet_aton(const char *strptr, struct in_addr *addrptr);
 返回值:字符串有效返回1,否则返回0

struct hostent *gethostbyname(const char *hostname);
struct hostent *gethostbyaddr(const char *addr, size_t len, int family);
注:addr不是点分字符串而是struct in_addr *
课堂练习:打印新浪主机的IP地址,再做反操作

ssize_t read(int fd, void *buf, size_t count);
ssize_t write (int fd,const void * buf,size_t count);
ssize_t recv(int sockfd, void *buff,size_t nbytes,int flags);
ssize_t send(int sockfd, const void *buff,size_t nbytes,int flags);

flags一般取0,
也可取
send、recv为
socket专用
对于TCP而言read、
recv返回0表示
远端socket已关闭

PDU 协议数据单元。

TCP/IP协议族使用地址结构是什么?分别有哪些重要成员?
字节序是怎么回事?网络字节序采用的是哪种字节序?
如何根据域名得到IP地址?
IP地址有几种表示方法?

int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
功能:通过三路握手建立与TCP服务器的连接

int sockfd;
struct sockaddr_in servaddr;

sockfd = socket(AF_INET,SOCK_STREAM,0);//创建套接字
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET; //指定协议族
servaddr.sin_port = htos(xxx); //指定服务器端口号
inet_aton(“a.b.c.d”, &servaddr.sin_addr);//指定服务器IP地址
//通过三路握手连接服务器
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr_in));
//……数据传输
close(sockfd);//关闭套接字

int bind(int sockfd, const struct sockaddr * myaddr, socklen_t addrlen);
功能:将本地协议地址赋予指定的socket描述符
返回值:成功为0,失败 < 0
参数:
sockfd: socket函数返回的socket描述符
myaddr:指向与协议族相符的地址结构指针
addrlen:实际地址结构的大小
int listen(int sockfd, int backlog);
功能:将主动套接字改为被动套接字(用来接受指向该套接字的连接请求),并设定套接字排队的最大连接个数。

int accept(int sockfd, struct sockaddr * cliaddr, socklen_t * addrlen);
功能:从已完成连接队列的对头返回一个已完成连接,队列空则阻塞等已完成连接
返回值:成功返回已完成连接对应的socket描述符,服务器通过这个描述符与请求连接的客户端进行数据传输。失败 < 0
参数:
sockfd:监听套接字(即服务器用来处理连接请求专用的被动套接字)。
cliaddr:返回已连接的对端进程(客户端)的协议地址。
addrlen:值-结果参数,调用前指定cliaddr的地址结构长度,返回后保存
对应地址结构的确切字节数。

注意监听套接字与已连接套接字的区分。
如果不关心客户端地址cliaddr和addrlen可以置为NULL。

int listenfd, connfd;
socklen_t len;
struct sockaddr_in servaddr, cliaddr;

listenfd = socket(AF_INET, SOCK_STREAM, 0);//
bzero(&servaddr, sizeof(servaddr));//
servaddr.sin_family = AF_INET;
inet_aton(“a.b.c.d”, &servaddr.sin_addr)
servaddr.sin_port = htons(xxx);
bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
listen(listenfd, yyy);
while(1) {
len = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &len);
//……数据传输
close(connfd);
}
close(listenfd);

int sockfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t cliaddrlen = sizeof(struct sockaddr_in);
sockfd = socket(AF_INET,SOCK_DGRAM,0);//创建套接字
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET; //指定协议族
servaddr.sin_port = htos(xxx); //指定服务器端口号
inet_aton(“a.b.c.d”, &servaddr.sin_addr);//指定服务器IP地址
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr_in));
while(1){//……数据传输
recvfrom(sockfd,buff,len,0,&cliaddr,&cliaddrlen);
//数据处理
sendto(sockfd,buff,len,0,&cliaddr,cliaddrlen);}
close(sockfd);//关闭套接

int sockfd;
struct sockaddr_in servaddr;

sockfd = socket(AF_INET,SOCK_DGRAM,0);//创建套接字
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET; //指定协议族
servaddr.sin_port = htos(xxx); //指定服务器端口号
inet_aton(“a.b.c.d”, &servaddr.sin_addr);//指定服务器IP地址
while(1){//……数据传输
//……制作数据
sendto(sockfd,buff,len,0,(struct sockaddr *)&servaddr,sizeof(servaddr));
recvfrom(sockfd,buff,len,0,NULL,NULL);
//……数据处理}
close(sockfd);//关闭套接字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值