作者:大宝同学
时间:2016-4-24
测试环境:gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) tq2440
OSI参考模型 TCP/IP参考模型
应用层 应用层
表示层
会话层
传输层 传输层
网络层 网络层
数据链路层 网络接口层
物理层
创建套接字:
#include
#include
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
在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 */
};
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地址,结果在函数返回值中返回,返回的是一个指向字符串的指针。
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位的参数从网络字节序转化为本地字节序
服务器 客户机
创建socket 创建socket
绑定地址 连接服务器
监听端口
等待连接
收|发数据 收|发数据
结束连接 结束连接
#include
#include
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
#include
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
#include
intlisten(int sockfd, int backlog);
sockfd:套接字描述符
backlog:服务器最大连接数
成功返回0,出错返回-1
#include
intaccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
addr:存放客户端地址信息
addrlen:地址长度
以上两个参数可以都设置为NULL
成功返回客户端套接字描述符
#include
#include
ssize_tsend(int sockfd, const void *buf, size_t len, int flags);
sockfd:目标套接字
buf:
len:
flags:
#include
#include
ssize_trecv(int sockfd, void *buf, size_t len, int flags);
sockfd:
buf:
len:
flags:
#include
intclose(int fd);
#include
#include
intconnect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
服务器 客户机
创建socket 创建socket
绑定地址
接受数据 发送数据
发送数据 接收数据
结束连接 结束连接
#include
#include
ssize_tsendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr,socklen_t addrlen);
dest_addr:用于存放目的地址
#include
#include
ssize_trecvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t*addrlen);
src_addr:用于存放消息来源地址