linux网络编程学习 | 您所在的位置:网站首页 › linux网络编程学习 › linux网络编程学习 |
linux网络编程学习 作者:大宝同学 时间:2016-4-24 测试环境:gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) tq2440 1 网络模型:OSI参考模型 TCP/IP参考模型 应用层 应用层 表示层 会话层 传输层 传输层 网络层 网络层 数据链路层 网络接口层 物理层 2 套接字socket:创建套接字: #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 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 /* See NOTES 可不要 */ #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 /* See NOTES*/ #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 /* See NOTES*/ #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 /* See NOTES*/ #include
intconnect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 7 UDP网络程序设计编程模型函数化 服务器 客户机 创建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:用于存放消息来源地址 0 0 学习Linux网络编程 学习Linux网络编程 学习Linux网络编程 学习linux网络编程 linux网络编程学习 Linux 网络编程学习 linux网络编程学习 学习Linux网络编程 linux网络编程学习 学习Linux网络编程教材 Linux网络编程学习总结 学习Linux网络编程(1) 学习Linux网络编程(1) Linux网络编程-学习笔记 linux网络编程学习1 Linux网络编程学习笔记 linux c 网络编程学习 Linux网络编程一站式学习 sizeof详解 POJ-3352 Road Construction (边双连通分量[Tarjan]) 南洋理工之导弹拦截(79) xx学习面向对象(一) 将Eclipse代码导入到AndroidStudio的两种方式 linux网络编程学习 栈和队列的有关操作 chi-squared test(卡方测验) ZOJ-3939-The Lucky Week【13th浙江省赛】【找规律】 成长点滴 Android 自定义View之View的绘制 tcp协议服务器和客户端相互发送数据 视频码流 java代码double保留指定位数 |
CopyRight 2018-2019 实验室设备网 版权所有 |