网络知识 及 TCP、UDP编程实现过程


***************网络预备知识*********************


Socket
        是一个编程接口
        是一种特殊的文件描述符 (everything in Unix is a file)
        并不仅限于TCP/IP协议
        面向连接 (Transmission Control Protocol - TCP/IP)
        无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)

IP地址
       IP地址是Internet中主机的标识
       Internet中的主机要与别的机器通信必须具有一个IP地址

端口号
        为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别.

        vi  /etc/services  
       
       TCP端口号与UDP端口号独立

       端口号一般由IANA (Internet Assigned Numbers Authority) 管理
       众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
       已登记端口:1024~49151
       动态或私有端口:49152~65535
     
字节序

           0x12345678

       不同类型CPU的主机中,
内存存储多字节整数序列有两种方法,

称为主机字节序(HBO):


小端序(little-endian) - 低序字节存储在低地址
           将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
        大端序(big-endian)- 高序字节存储在低地址
           将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用

网络字节序是大端字节序。


***************转换函数******************************

     in_addr_t inet_addr(const char *cp);
     功能:将点分十进制的ip字符串,转换为二进制的网络字节序数据。
     参数:cp  ip字符串

     uint16_t htons(uint16_t hostshort);
     功能:将无符号短整形主机字节序数据转换为网络字节序数据。

     char *inet_ntoa(struct in_addr in);
     功能:将网络字节序的二进制数据,转换为 点分十进制的字符串

     uint16_t ntohs(uint16_t netshort);
     功能:将网络字节序的数据,转换为主机字节序数据

*******************************************************


【1】TCP/IP协议

    传输控制/网际协议(Transfer Control Protocol/Internet Protocol) 又称作网络通讯协议
    TCP(即传输控制协议):是一种面向连接的传输层协议

    它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)


TCP 客户端编程:


1-- 创建网络套接字
       socket();
2-- 填充网络信息结构体

serveraddr.sin_family = AF_INET; //AF_INET 网络通信
serveraddr.sin_addr.s_addr = inet_addr(argv[1]); // ip
serveraddr.sin_port = htons(atoi(argv[2])); //端口号

3--向服务器发起连接请求

       connect();

4-- 发送消息
       send();

5-- 接收消息
       recv();


TCP 服务器编程:


1-- 创建网络套接字

       socket();
2-- 填充网络信息结构体
serveraddr.sin_family = AF_INET; //AF_INET 网络通信
serveraddr.sin_addr.s_addr = inet_addr(argv[1]); // ip
serveraddr.sin_port = htons(atoi(argv[2]));
//端口号
3-- 绑定套接字

       bind();

4--将套接字置为被动监听模式,监听请求的到来

listen();
5--接收客户端的连接请求,返回一个新的网络套接字(专门被用来与相对应的客户端进行通信)

accept();
6-- 接收消息
       recv();
7-- 发送消息
       send();


【2】UDP 通信

     UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议
。在数据发送前,因为不需要进行连接,所以        可以进行高效率的数据传输。

适用情况:
     发送小尺寸数据(如对DNS服务器进行IP地址查询时)

     在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)

     适合于广播/组播式通信中。

    MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议

    流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输


*************************************************************************
     标准通信结构体:
      struct sockaddr{
               sa_family_t sa_family;
               char        sa_data[14];
      }
************************************************************************* 

UDP 客户端编程:

1-- 创建网络套接字

       socket();
2-- 填充网络信息结构体
serveraddr.sin_family = AF_INET; //AF_INET 网络通信
serveraddr.sin_addr.s_addr = inet_addr(argv[1]); //ip
serveraddr.sin_port = htons(atoi(argv[2])); //端口号
socklen_t addrlen = sizeof(struct sockaddr);   //标准信息结构体的大小
3-- 发送消息
       sendto();
4-- 接收消息
       recvfrom();


UDP 服务器编程:

1-- 创建网络套接字
       socket();
2-- 填充网络信息结构体
serveraddr.sin_family = AF_INET; //AF_INET 网络通信
serveraddr.sin_addr.s_addr = inet_addr(argv[1]); //ip
serveraddr.sin_port = htons(atoi(argv[2])); //端口号
3-- 绑定套接字
       bind();
4-- 接收消息
       recvfrom();
5-- 发送消息
       sendto();





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值