linux socket 编程一:简单的服务器和客户端通信

本文介绍了Linux下socket编程的基本概念和使用方法,包括socket的起源、协议家族、地址结构、常用接口,以及服务器端和客户端的简单通信示例代码。通过示例展示了如何创建socket、绑定、监听、接受连接和数据传输的过程。
摘要由CSDN通过智能技术生成

一    什么是socket

socket是最初由伯克利分校为unix设计的通信机制,它对网络通信的底层(各协议栈)进行了封装(例如tcp/ip协议栈由操作系统设计,已经集成到内核中了,通过socket接口可以来调用系统通信方面的内核函数),使得底成的机制对用户来说是透明的。后来其他的厂商也实现了各自的socket,包括微软等公司,为了兼容unix套接字,他们的接口和unix socket的接口是一致的。unix socket 一般分为三种: SOCK_STREAM(tcp socket), SOCK_DGRAM(udp), raw socket(自己指定底成的协议,原生套接字).

二 unix socket使用

1. 包含的头文件

#include  <sys/socket.h>    包含了socket接口的声明

#include <netinet/in.h>     包含了tcp/ip(AF_INET)相关地址结构,地址转换函数的声明,sockaddr,sockaddr_in,inet_addr,()inet_ntoa(),inet_aton()


#include <arpa/inet.h>   包含了字节序转换的相关函数 htons() ,  ntohs(), htonl(),ntohl()

ps:字节序分为大端自己序,和小端字节序。他们影响数据在内存中存放的规律。大端字节序表示数据的高位存在内存的低地址,数据的低位存放在高地址:如 0x12345678 ,假设内存地址从左到右依次递增,则数据从左往右的排列为: 0x12   0x34  0x56  0x78.小端字节序刚好相反。socket通信中,字节序分为网络字节序和本地字节序,网络字节序规定为大端字节序,本地字节序由自己的环境决定,既可以为大端字节序,也可以为小端字节序。在通信的过程中,如果不统一字节序,将导致数据的不一致性。

2. protocol families 协议家族

协议家族就是一组协议的集合,例如tcp/ip。AF_INET, AF_IPX, AF_PACKET,都是socket定义好的协议家族,其中AF_INET指的就是tcp/ip.以下是linux文档中指明的相关协议家族。

 Name                Purpose                          Man page
 AF_UNIX, AF_LOCAL   Local communication              unix(7)
AF_INET             IPv4 Internet protocols          ip(7)

AF_INET6            IPv6 Internet protocols          ipv6(7)
AF_IPX              IPX - Novell protocols
AF_NETLINK          Kernel user interface device     netlink(7)
AF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)
AF_AX25             Amateur radio AX.25 protocol

AF_ATMPVC           Access to raw ATM PVCs

AF_APPLETALK        Appletalk                        ddp(7)
AF_PACKET           Low level packet interface       packet(7)



3 .协议家族的地址结构

a.通用的地址结构

不同的协议家族的地址结构是不一样的,不过他们都可以转换成通用的socket地址结构:

           struct sockaddr {
               sa_family_t sa_family;
               char        sa_data[14];
           }


b.AF_INET协议家族的地址结构

            struct sockaddr_in {
               sa_family_t    sin_family; /* address family: AF_INET */
               in_port_t      sin_port;   /* port in network byte order  2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值