首页 > 系统相关 >linux socket

linux socket

时间:2023-02-07 23:14:01浏览次数:51  
标签:UDP 字节 bind 函数 linux 连接 socket

Linux网络基础编程

 

内容简介

一、socket的概念

二、socket的类型

三、socket的位置

四、网络地址

五、端口号

六、字节序

七、socket基础编程

 

一、socket的概念

在Linux中的网络编程是通过socket接口来进行的。

socket是一种特殊的I/O接口,它也是一种文件描述符。它是一种常用的进程之间的通信,而且通过网络能够在不同的机器上的进程之间进行通信。

socket也有一个类似于打开文件的函数调用,该函数返回一个整型的 socket描述符,随后的连接建立,数据传输等操作都是通过socket来实现的。

二、socket的类型

(1)流式socket((socket《SOCKSTREAM)

流式套接字提供可靠的、面向连接的通信流:它使用TCP协议,从而保证了数据传输的正确性和顺序性。

(2)数据报socket(SOCK DGRAM)

数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,而且是不保证是可靠、无差错的。它使用数据报协议UDP

(3)原始socket

原始套接字允许对底层协议如P或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。

五、端口号

端口号

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

端口号一般由ANA(Internet Assigned Numbers Authority)管理

众所周知端口:1~1023(1-255之间为众所周知端口,256~1023端口通常由UNX系统占用)

注册端口:1024~49150

动态或私有端口:49151~65535

六、字节序

字节序

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

小端序(little-endian-)

低序字节存储在低地址,将低字节存储在起始地址IntelAMD等采用的是这种方式。

大端序(big-endian-)

高序字节存储在低地址,将高字节存储在起始地址ARM、Motorola等采用这种方式。

网络中传输的数据必须按网络字节序,即大端字节序。

在大部分PC机上,当应用进程将整数送入 socket前,需要转化成网络字节序;当应用进程从socket取出整数后,要转化成小端字节序。

网络字节序(n- Network Byte Order)

把给定系统所采用的字节序称为主机字节序,为了避免不同类别主机之间在数据交换时由于字节序不同而导致的差错,引入了网络字节序。使用统一的字节顺序,避免兼容性问题。

不同主机的HBO(Host Byte Order)是不一样的,这与CPU的设计有关。

Motorola68K系列,ARM系列,HBO与NBO是一致的。

Intel X86系列,HBO与NBO是不一致的

字节序转换函数

这里用到了四个函数: htons, ntohs0, htonl和htohl0,这四个函数分别实现网络字节序和主机字节序的转化,这里的h代表ost,n代network表,s代short表代表long.通常16位的P端口号用s表示,而P地址用I表示。

 

 

七、Socket基础编程

网络编程相关API

网络编程常用函数:

socket:用于建立个socketi连接,可指定socket类型等信息在建立了socket连接之后可对sockaddrsockaddr或 in结构进行初始化,以保存所建立的socket地址信息。

bind:用于将本地IP地址绑定到端口号,若绑定其他P地址则不能成功另外,它主要用于TCP连接,而在UDP的连接中则无必要。

listen():在服务端程序成功建立套接字和与地址进行绑定之后,还需要准备在该套接字上接收新的连接请求此时调用listen()函数来创建一个等待队列,在其中存放未处理的客户端连接请求。

accept():服务端程序调用listen()函数创等待队列之后,调用 accept函数等待并接收客户端的连接请求。它通常从bind()所创建的等待队列中取出第一个未处理的连接请求。

 

 

网络编程常用函数:

connect():

该函数在TCP中是用于bind()的之后的客户端,用于与服务器建立连接,而在

UDP中由于没有了bind()函数,因此用connect有点类似bind函数的作用

send()和recv():

这两个函数分别用于发送和接收数据,可以用在TCP中,也可以用在UDP

中当用在UDP时,可以在connect)函数建立连接之后再用

sendto()和recvfrom():

这两个函数的作用与send(和rec函数类似,也可以用在CP和UDP中,当用在TCP时,后面的几个与地址有关参数不起作用,函数作用等同于send和recv;当用在UDP时,可以用在之前没有使用connect()的情况下,这两个函数可以自动寻找指定地址并进行连接。

 

 

socket

 

 

Socket信息数据结构

 

 

地址结构的一般用法

1定义一个struct sockaddr in类型的变量并清空

struct sockaddr in myaddr:

memset(&myaddr, 0, sizeof(myaddr))

2填充地址信息

myaddr.sin family AF INET;

myaddr.sin port =htons (8888);

myaddr.sin addr.s addr inet addr ("192.18.1.100");

 

 

bind()

该函数是用于将本地地址绑定到端口号若绑定其他P地址则不能成功。另外,它主要用于TCP的连接,而在UDP的连接中则无必要。

 

 

 

 

listen()

在服务端程序成功建立套接字和与地址进行绑定之后,还需要在该套接字上接收新的连接请求。此时调用listen()函数来创建一个等待队列,在其中存放未处理的客户端连接请求。

 

accept()

服务端程序调用listen()函数创建等待队列之后,调用accept()函数等待并接收客户端的连接请求。它通常从由bind()所创建的等待队列中取出第一个未处理的连接请求。

 

 

connect()

Socket基础编程

connect)

该函数在TCP中是用于bind之后的client端,用于与服务器端建立连接,而在UDP中由于没有了bind()函数,因此用connect()有点类似bind()函数的作用。

 

send()和recv():

这两个函数分别用于发送和接受数据。

 

 

 

 

标签:UDP,字节,bind,函数,linux,连接,socket
From: https://www.cnblogs.com/woodx/p/17100105.html

相关文章

  • linux下安装python3.7
    linux下安装python3.71.安装依赖包,如果不安装将导致编译失败,或者功能缺失yum-yinstallopenssl-develzlib-develgcc2.在local目录下创建python3目录,供放置最终......
  • linux测试ipv6
    前言操作系统版本:centos7.6curl版本:7.87(centos7自带的curl版本是7.29,测ipv6会有问题)系统开启ipv6centos7默认开启ipv6,可检查net.ipv6.conf.all.disable_ipv6和ne......
  • Linux常用命令行记录
    Linux系统相关pwd显示工作路径shutdown-hnow关闭系统/halt关闭系统shutdown-rnow重启/reboot重启systemctlstopfirewalld关闭防火墙ipaddr......
  • Linux进程服务管理
    在Linux中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个ID号。每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。例如www服务器。每个进程都......
  • Linux常用命令-文件相关(学习笔记一)
    学习整理文件和文件夹常用的命令,记录常规用法,便于查找,详细的命令用法后续研究创建文件夹mkdirfolderName重命名文件夹mv是移动文件和文件夹,可以将文件夹移动......
  • Linux编程入门
    GCCGNU编译器'-std=c99'表示指定编译标准安装sudoaptinstallgccg++查看版本gcc/g++-v/--version运行gcctest.c-oapp(编译)./app其中,app为自命名,可......
  • Linux下线程编程(1)
    1.线程简介  线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可......
  • 关于nginx-启动报错nginx: [emerg] socket() [::]:80 failed (97: Address family not
    今天在一台服务器上使用yum安装了nginx,然后启动报错:nginx:[emerg]socket()[::]:80failed(97:Addressfamilynotsupportedbyprotocol)先说一下环境,OSRelease:......
  • STM32MP157开发板Linux+Qt项目实战:智慧家庭
    stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux+单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器,集成2个Cortex-A7......
  • Linux基础第一章:基础知识与基础命令
    一、虚拟机网络环境-网卡三种连接方式桥接模式:虚拟机和本机使用同一个物理网卡,共享主机IP地址nat模式:内外网地址转换,生成一个VMware8网卡,此网卡必须与虚拟机在同一个网段,......