linux网络编程学习 您所在的位置:网站首页 linux网络编程学习 linux网络编程学习

linux网络编程学习

#linux网络编程学习| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有