linux网络编程学习
作者:大宝同学
时间:2016-4-24
测试环境:gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) tq2440
1 网络模型:
OSI参考模型 TCP/IP参考模型
应用层 应用层
表示层
会话层
传输层 传输层
网络层 网络层
数据链路层 网络接口层
物理层
2 套接字socket:
创建套接字:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
domain:
Name Purpose Man page
AF_UNIX, AF_LOCAL Local communication unix(7)
AF_INET IPv4Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
AF_NETLINK Kernel user interface device netlink(7)
type:
SOCK_STREAM 有序、可靠、双向的面向连接字节流 TCP
SOCK_DGRAM 长度固定的、无连接的不可靠报文传递 UDP
SOCK_SEQPACKET 长度固定、有序、可靠的面向连接报文传递
SOCK_RAW IP协议的数据报接口
procotol:通常为0
3 地址格式:
在IPv4因特网域(AF_INET)中,套接字地址用结构sockaddr_in表示:
structin_addr
{
in_addr_t s_addr; /* IPv4 address */
};
structsockaddr_in
{
sa_family_t sin_family; /* address family */
in_port_t sin_port; /* port number */
struct in_addr sin_addr; /* IPv4 address */
};
4 地址转换:
unsigned long int inet_addr(const char * cp):
该函数把一个用数字和点表示的IP地址的字符串转换成一个无符号长整型,
unsigned int s_addr=inet_addr("202.206.17.101")
inet_aton(const char * cp,struct in_addr * inp)
此函数将字符串形式的IP地址转换成二进制形式的IP地址;成功时返回1,否则返回0,转换后的IP地址存储在参数inp中。
char * inet_ntoa(struct in_addr in):
将32位二进制形式的IP地址转换为数字点形式的IP地址,结果在函数返回值中返回,返回的是一个指向字符串的指针。
5 字节序转换:
uint32_t htonl(uint32_t hostlong);
该函数把32位的参数从本地字节序转化为网络字节序
uint16_t htons(uint16_t hostshort);
该函数把16位的参数从本地字节序转化为网络字节序
uint32_t ntohl(uint32_t netlong);
该函数把32位的参数从网络字节序转化为本地字节序
uint16_t ntohs(uint16_t netshort);
该函数把32位的参数从网络字节序转化为本地字节序
6 TCP网络程序设计
编程模型函数化
服务器 客户机
创建socket 创建socket
绑定地址 连接服务器
监听端口
等待连接
收|发数据 收|发数据
结束连接 结束连接
创建套接字
#include<sys/types.h> /* See NOTES 可不要 */
#include<sys/socket.h>
intsocket(int domain, int type, int protocol);
domain:AF_INET
type:SOCK_STREAM SOCK_DGRAM
potocal:0
eg:tcp_socket = socket(AF_INET,SOCK_STREAM, 0);
udp_socket = socket(AF_INET, SOCK_DGRAM,0);
返回值:套接字描述符 出错-1
绑定地址
#include<sys/types.h> /* See NOTES*/
#include<sys/socket.h>
intbind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
sockfd:socket描述符
addr:可以指定为INADDR_ANY,或者使用下面的结构体描述
structsockaddr_in
{
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
structin_addr
{
uint32_t s_addr; /* address in network byte order */
};
addrlen:sizeof(struct sockaddr)
成功返回0,出错返回-1
监听端口
#include<sys/types.h> /* See NOTES*/
#include<sys/socket.h>
intlisten(int sockfd, int backlog);
sockfd:套接字描述符
backlog:服务器最大连接数
成功返回0,出错返回-1
等待连接
#include<sys/socket.h>
intaccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
addr:存放客户端地址信息
addrlen:地址长度
以上两个参数可以都设置为NULL
成功返回客户端套接字描述符
发送数据
#include<sys/types.h>
#include<sys/socket.h>
ssize_tsend(int sockfd, const void *buf, size_t len, int flags);
sockfd:目标套接字
buf:
len:
flags:
接收数据
#include<sys/types.h>
#include<sys/socket.h>
ssize_trecv(int sockfd, void *buf, size_t len, int flags);
sockfd:
buf:
len:
flags:
关闭连接
#include<unistd.h>
intclose(int fd);
连接服务器
#include<sys/types.h> /* See NOTES*/
#include<sys/socket.h>
intconnect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
7 UDP网络程序设计
编程模型函数化
服务器 客户机
创建socket 创建socket
绑定地址
接受数据 发送数据
发送数据 接收数据
结束连接 结束连接
发送数据
#include<sys/types.h>
#include<sys/socket.h>
ssize_tsendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr,socklen_t addrlen);
dest_addr:用于存放目的地址
接收数据
#include<sys/types.h>
#include<sys/socket.h>
ssize_trecvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t*addrlen);
src_addr:用于存放消息来源地址