Unix网络编程(一)基本字段和常用函数

UNIX网络编程——基本SCTP套接字编程 1、一到一形式:(与TCP的典型用法几乎一样)        一到一形式套接字是一个类型为SOCK_STREAM,协议为IPPROTO_SCTP的网际套接字。 2、一到多形式:        服务器程序无需管理大量的套接字描述符,单个套接字描述符将代表多个关联。在一到多形式的套接字上,用“关联标识”来标识单个连接。        一到多形式套接字是一个类型为SOCK_S 阅读详情

Unix网络编程(一)基本字段和常用函数

1.基本字段
2.常用函数

基本字段

      用来表示地址的结构有两个,都是定义在in.h中,分别是sockaddr_in和sockaddr。通常定义并初始化sockaddr_in,在使用函数传递参数时将其强转为后者,因为在大多数函数中,要求的指针类型都sockaddr,然而sockaddr_in的字段较为丰富,容易赋值。

具体的字段定义如下

sockaddr_in

/* Structure describing an Internet socket address.  */
struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;         /* Port number.  */
    struct in_addr sin_addr;        /* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
               __SOCKADDR_COMMON_SIZE -
               sizeof (in_port_t) -
               sizeof (struct in_addr)];
  };

sockaddr

/* Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
    char sa_data[14];       /* Address data.  */
  };

在这里特别要提的是
第一个字段__SOCKADDR_COMMON 在sockaddr.h中定义为

#define __SOCKADDR_COMMON(sa_prefix) sa_family_t sa_prefix##family

就是以前的sa_family_t类型的名为sin_family的字段。代表着该socket使用的协议族。常用的有AF_INET和AF_INET6,前者代表Ipv4,后者代表Ipv6。

以及sockaddr_in的最后一个字段sin_zero,它是通过计算,让sockaddr_in和sockaddr保持同样的空间大小,保证转换时的完整性。

基本函数

socket()

     int socket(int domain, int type, int protocol);

作用:建立一个新的socket
返回值:成功则返回socket对应的代码,失败则为-1
参数:
   1.第一个参数指定何种类型的协议族,常用有AF_INET和AF_INET6两种。完整的定义在/usr/include/bits/socket.h 内
  2.第二个参数指定类型,常用的是SOCK_STREAM(TCP协议),SOCK_DGRAM(UDP协议)。
  3.第三的参数指定传输协议,但因为会自动设置为type参数所对应的协议。因此设置为0即可

connect()

    int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);

作用:将socket 连至参数serv_addr 指定的网络地址
返回值:成功则返回0, 失败返回-1, 错误原因存于errno 中.
参数:
    1.第一个是socket
    2.第二个是sockaddr的指针
    3.第三个是指针的长度(大小)

bind()

    int bind (int sockfd, struct sockaddr * my_addr, int addrlen)

作用:用于将本地地址与socket捆绑
返回值:成功则返回0, 失败返回-1, 错误原因存于errno 中.
参数:
    1.第一个是socket
    2.第二个是sockaddr的指针
    3.第三个是指针的长度(大小)

listen()

    int listen (int __fd, int __n)

作用:监听申请的连接
返回值:正确则返回0。否则的话,返回SOCKET_ERROR错误
参数:
   1.第一个为socket的描述符
   2.第二个为等待连接队列的最大长度。

accept()

    int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)

作用:接受来自指定socket的请求,并为该请求分配一个新的描述符
返回值:成功则返回新的socket 处理代码, 失败返回-1, 错误原因存于errno 中.
参数:
   1. 第一个参数socket的描述符
    2.第二个是sockaddr的指针
    3.第三个是指针的长度(大小)

close()

    int close (int __fd)

作用:释放对应的文件描述词
返回值:若文件顺利关闭则返回0, 发生错误时返回-1.
参数:

代码

以下是两个例子,
第一个是向13端口请求数据。(13端口是daytime服务的端口,返回所在主机的时间。因此运行时要求开启13端口)。
第二个是模拟daytime服务器,对访问13端口的请求返回主机时间。


请求13端口
#include    <sys/socket.h>  /* basic socket definitions */
#include    <netinet/in.h>

int main()
{
    int                 sockfd, n;
    char                recvline[MAXLINE + 1];
    struct sockaddr_in  servaddr;
    char *IPaddress = "127.0.0.1";

    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)    /*创建socket*/
        printf("socket error");

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port   = htons(13);    /* 13端口是daytime服务 */
    if (inet_pton(AF_INET, IPaddress, &servaddr.sin_addr) <= 0) /*该函数将字符型表达(presentation)转换位数值(number)*/
        printf("inet_pton error for %s", argv[1]);

    if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)/*建立连接*/
        printf("connect error");

    while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {    /*读取流信息*/
        recvline[n] = 0;    /* null terminate */
        if (fputs(recvline, stdout) == EOF)
            printf("fputs error");
    }
    if (n < 0)
        printf("read error");

    exit(0);
}
    模拟daytime服务
    #include    <sys/socket.h>  /* basic socket definitions */
#include    <netinet/in.h>
#include    <time.h>

int
main(int argc, char **argv)
{
    int                 listenfd, connfd;
    socklen_t           len;
    struct sockaddr_in  servaddr, cliaddr;
    char                buff[MAXLINE];
    time_t              ticks;

    listenfd = Socket(AF_INET, SOCK_STREAM, 0);/*创建socket*/

    bzero(&servaddr, sizeof(servaddr));     /*初始化servaddr,将其清空为0.可用memset函数代替,以下三步为其字段赋值*/
    servaddr.sin_family      = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);   /*INADDR_ANY为0x00000000 ,意为接收任何来到该地址的请求*/
    servaddr.sin_port        = htons(13);   

    bind(listenfd, (SA *) &servaddr, sizeof(servaddr));     /*将socket与本机指定端口和地址捆绑*/

    listen(listenfd, LISTENQ);  /*开启监听*/

    for ( ; ; ) {
        len = sizeof(cliaddr);
        connfd = accept(listenfd, (SA *) &cliaddr, &len); /*当有连接时,将该连接的句柄绑定到connfd上*/
        printf("connection from %s, port %d\n",     /*打印请求地址*/
               Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
               ntohs(cliaddr.sin_port));

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));   /*返回时间*/
        write(connfd, buff, strlen(buff));

        close(connfd);
    }
}

UNIX网络编程卷一 第三章 地址定义及相关函数 本章主要说明: 1. 5中不同的套接字地址,以及其结构体定义,和使用说明。 2. 网络地址的结构体(数字)和字符串相互转换函数。 3. 字节序测试,调整函数。 4. 内存按字节操作函数。 一、 套接字地址结构 这些结构体地址很多,感觉很难记,可能要以后多实践吧。。 所有网络地址都是以sockaddr_ 开头的结构体组成,包括IPV4的 struct sockaddr_in{} 阅读详情

相关推荐

UNIX网络编程实战:套接字API源码详解

UNIX网络编程是构建现代网络服务的基石,它通过标准的套接字(Socket)API 实现跨网络的进程间通信。本章将引导读者理解网络编程的基本模型,包括客户端-服务器架构与TCP/UDP协议的差异。TCP提供可靠的面向连接的通信,而UDP则适用于低延迟、非连接的场景。我们将通过经典示例展示如何使用C语言在UNIX环境下进行网络通信,并解析《UNIX网络编程》一书中源码的学习路径。本章适合具备基础C语言与操作系统知识的IT从业者,尤其是希望深入系统级网络编程的中高级开发人员。// IPv4 地址结构。

weixin_35578748的博客 843

unix网络编程基本编程

今天和大家分享一些基本套接口的编程函数,为帮助大家更好的理解connect、accept和close函数并使用netstat调试TCP应用程序,我们需要了解如何建立和终止TCP连接以及TCP的状态转换图。这样能够帮助我们编写网络程序的例子。        《一》三次握手:            下述步骤建立一个TCP连接:             1.服务器必须准备好接受外来的连接。这通

ooooo12345re的博客 2320

学习Python,小白如何搭建Python环境?

学习Python,首先需要搭建好Python环境,主要分为【运行环境搭建】、【开发环境搭建】以及【Python环境配置】三个环节,接下来我将对Python环境搭建这三个部分进行介绍。

weixin_72923265的博客 9010

UNIX网络编程卷一 笔记 第四章 基本TCP套接字编程

1     socket函数 int socket(int family, int type, intprotocol); 其中family是协议族,type是套接字类型,protocol为某个协议组合,设为0的话是取family和type组合的系统默认值。 常用的family值有:AF_INET(IPV4)、AF_INET6(IPV6)。 常用的type值有:SOCK_STREA

企鹅的自我修养 1271

pwm电机调速的原理介绍与代码实现

1、pwm实现调速的原理与介绍 PWM(Pulse Width Modulation)脉冲宽度调制。 1)占空比 pwm占空比就是一个脉冲周期内有效电平在整个周期所占的比例。 通过调节PWM的占空比就能调节IO口上电压的持续性变化,因此也能够控制外设的功率进行持续性变化,也就能控制直流电机的转速快慢。 那么重点就在于如何调节PWM波形的输出。如下图所示 图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4

Clichong 7万+

详细推导波特图增益和相位曲线

文章来源:https://mp.weixin.qq.com/s/UCy9mRRok5Hc9qHq3qde5g 今天这篇文章想把近段时间关于波特图方面学习的内容整理一下。波特图将会是梳理闭环控制这个系列的开始。目前的计划是,以无源器件为基础,然后结合运放,再过渡到开关电源的环路控制方面。如果对这方面感兴趣的朋友,可以持续一起学习起来,目标就是掌握开关电源的闭环控制。 1. 什么是波特图? 波特图最常见的应用是在线性非时变的系统中,用于对传递函数的增益和相位进行分析,从而判断出系统随频率的响应是否稳定。因此,波

ltqdxl的博客 2万+

《UNIX网络编程》阅读笔记:套接字地址结构及基本概念

简介 套接字地址结构可以在两个方向上传递:从进程到内核和从内核到进程。 地址转换函数在地址的文本表达和它们存放在套接字地址结构中的二进制值之间进行转换。 多数现存的IPv4代码使用inet_addr和inet_ntoa函数,不过两个新函数inet_pton和inet_ntop同时适用于IPv4和IPv6两种代码。 这些地址转换函数与所转换的地址类型协议相关,要考虑是IPv4地址还是IPv6地址。这里使用一组名字以sock_开头的函数,它们以协议无关方式使用套接字地址结构。 套接字地址结构...

baidu_41388533的博客 1447

校园网改造实录:手把手教你用华为MA5800 OLT调试全光网(附常用排错命令)

本文详细记录了校园全光网改造中华为MA5800 OLT的部署与调试过程,涵盖设备选型、基础配置、ONU批量部署及高频故障排查。通过实战案例和排错命令,帮助网络工程师快速掌握全光网调试技巧,实现低延迟、高稳定的网络性能。

weixin_42552716的博客 573

unix网络编程

略

google20的博客 674

UG NX二次开发(C#)-建模-获取圆柱面信息(轴向、半径、深度)

获取圆柱面的信息前言一、在UG NX中面的类型有哪些?二、获取圆柱面信息的函数1.获取半径和轴向2、计算圆柱面的深度值3、测试用例总结 文章目录前言一、在UG NX中面的类型有哪些?二、获取圆柱面信息的函数1.获取半径和轴向2、计算圆柱面的深度值3、测试用例总结 前言 在一个项目中,需要遍历曲面,获得所有的圆柱面和圆柱面的信息,包括轴向、半径和圆柱面的深度。经过研究,采用uFModl.AskFaceData(face.Tag, out faceTypeInt, point, dir, box, out

GimiGimmy 4145

ACS运动控制器编程语言

ACS运动控制器采用SPiiPlusLanguage(SPL)作为核心编程语言,该语言基于C语法设计,内置丰富的运动控制指令,支持点位运动、插补等复杂控制。控制器提供专用开发工具SPiiPlusManager和ACSStudio,支持图形化编程与调试。同时兼容TCP/IP、EtherCAT等多种扩展接口,便于与上位机或PLC集成。使用时需注意实时性优先级、轴参数匹配等关键事项。官方文档和示例程序为开发者提供了完善的学习资源。

StevenChen的博客 624

UNIX网络编程——概述

1、编写计算机网络通信程序,首先要确定这些程序相互通信所用的协议。在深入设计一个协议之前,应该从高层次决断由哪一个程序发起通信,以及在何时产生响应。 2、(1)客户与服务器使用TCP在同一个局域网 (2)客户与服务器在不同局域网(使用广域网连接) 3、OSI模型和网际协议族中的各层         我们不关心OSI的最底两层。网络层由IPv4和IPv6这两个协议处理。可选择

松狮 645

实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理

探讨如何基于实现一个高效的上下文管理组件,以解决多线程环境下的数据共享和上下文管理这些问题。通过具体的代码示例和实战展示如何为多线程编程提供一种简洁而高效的上下文管理方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 11万+

Linux网络——网络编程的基本知识、socket网络编程接口和UDP网络程序实战

一、网络编程基本知识 1.1 源IP地址和目的IP地址 在ip数据包头部,有两个ip地址,分别叫做源ip地址和目的ip地址 源ip地址标记着数据是从哪里发出来的,目的ip地址表示发往那台主机 IP地址标定全网内唯一一台主机 1.2 端口号和PID 端口号(port)是传输层协议的内容. 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; IP地址 + 端口号能够标识网络上的某一台主机的某一个进程,进一步可认为全网内唯一的一个进

3894

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Unix网络编程卷一第三章笔记

前言 这篇文章主要是Unix网络编程卷一第三章的个人笔记 1.POSIX 规范的三个字段 sin_family sin_addr sin_port 五个套接字结构 IPV4(sockaddr_in) IPV6(sockaddr_in6) Unix(sockaddr_un) 数据链路(sockaddr_dl) 存储(sockaddr_storage) 2.IPV4 套接字结构 in_addr sockaddr_in sockaddr inaddr _t s_ad

weixin_44546834的博客 245

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

UNIX网络编程笔记:套接字

套接字(Socket) 是网络编程中的核心概念,可以理解为一种通信端点,用于实现不同设备之间的数据交换。它类似于现实中的“插座”,为应用程序提供了一套标准接口,允许程序通过网络发送或接收数据。套接字是操作系统提供的底层通信工具,支持多种协议(如 TCP、UDP),是构建网络应用(如网页、聊天软件、游戏)的基础。建立连接 通过套接字,程序可以与其他设备(本地或远程)建立网络连接,例如客户端与服务器的通信。数据传输 套接字提供发送和接收数据的功能,支持可靠传输(如 TCP)或高效传输(如 UDP)。地址管理 每

梅见十柒的博客 1381

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Unix网络编程 第三章 笔记

Unix网络编程 第三章 笔记 1. 套接字地址结构 1.1 IPv4套接字地址结构 套接字地址结构仅在给定主机上使用:虽然结构中某些字段(如IP地址和端口号)用在不同主机之间通信中,但是结构本身并不在主机之间传递。 1.2 通用套接字地址结构 当套接字地址结构传入任何套接字函数时,套接字地址结构总是以引用的形式来传递。对这些函数的任何调用都必须要将指向特

hyxabc123的博客 577

Unix网络编程(二)套接字地址结构常用函数

注明:本文为学习经验的总结,绝大部分引用自Unix网络编程卷一,有错误或者交流意见请发邮件至yb.zhaoyubo@gmail.com.非常感谢 上篇文章简单介绍了几个金

zhaoyubo的专栏 700

unix网络编程--锁(一)

  阅读了unix网络编程的卷二之后,看着里面的实例并且理解其原理算法,就将里面的C语言的锁API进行C++封装以供以后使用。实现的锁接口以及一些算法会封装到我的TimePass库中。我觉得应该就锁的问题写一个系列的博客。锁按照其作用域可以分为线程锁和进程锁; 按照其工作方式:又可以分为互斥锁,读写锁,文件锁。读写锁也是互斥,只是相对于读写锁来说更加精细,其分为读...

dlzptbbs534263的博客 192

Unix 网络编程 卷一 运行daytimetcpcli 出现Connection refused

系统:FreeBSD4.4Unix 网络编程 卷一源文件编译的问题解决完成后。运行 ./daytimetcpcli 127.0.0.1出现Connection refused.于是网上找开放13端口的时间获取服务器,结果没有找到,索性自己开放自己的13端口试试。运行netstat -an  没有发现13端口。从网上了解时间服务器在inetd中,百度百科显示inet如下:inetd是监视一些网络请求...

zhenyi2000的博客 1762

Unix 网络编程 函数

<br />SOCKET socket( int af, int type, int protocol ); <br />  作用:应用程序调用socket函数来创建一个能够进行网络通信的套接字。   <br />        第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;   <br />        第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW <br

alex_liu的技术堡垒 423

UNIX网络编程笔记:高级套接字编程12-19

摘要:本文深入探讨了IPv4与IPv6互操作性的关键技术,包括NAT64协议转换、DNS64协同方案等跨协议通信方法,以及开发辅助工具和代码适配策略。同时解析了Unix/Linux系统中守护进程和inetd超级服务器的核心功能,如syslogd日志管理、daemon_init进程守护化、inetd按需调度网络服务等。这些技术共同构成了网络协议演进和系统服务管理的基础框架,为开发者、运维人员提供了实现平滑过渡和高效资源管理的解决方案,确保新旧系统兼容性和服务稳定性。(150字)

梅见十柒的博客 990

网络编程基础

这个字段表示了套接字地址的类型,以便在处理套接字地址时正确地解释其余的结构体字段。在传输过程中,不同协议层对数据包有不同的称谓,如在传输层称为“段”、在网络层称为“数据报”、在链路层称为“帧”。IPv6是IP协议的新版本,为网络提供更多的地址空间。OSI七层模型为网络协议提供了一种清晰的框架,将网络分为七个层次,每个层次负责特定的功能。字段表示地址的协议族,通常是 AF_INET(IPv4)或 AF_UNIX(UNIX 域套接字)。该结构体在套接字编程中扮演着重要的角色,用于指定网络通信的终端地址。

yualian的博客 1682

UNIX网络编程(三)---套接字编程简介

UNIX网络编程 第3章 套接字编程简介 一、套接字地址基本结构 大多数套接字地址结构以sockaddr_in命名,每个协议族都定义它的套接字地址结构。 1)IPv4套接字地址结构 为什么in_addr结构体内仅有一个in_addr_t字段的结构? 以前地址被分为A,B,C类的时候,为了便于获得地址中的适当字节,允许访问一个32位IPv4地址...

sgh666666的博客 332

Unix 网络编程(三)- 网络套接字编程“基础API”介绍

写在开头: 在第二篇博文中我们学习了套接字编程所需要的关于传输层协议的一些理论知识,从而对像“TCP建立连接的三次握手”等知识有了了解。在掌握了这些知识之后,我们开始学习套接字编程的API。因为API太多而且使用不同传输协议的套接字有些API不同,所以给我们的学习带来了很大的困难。为了系统的有层次的学习这些API,我们将遵循《Unix网络编程套接字联网API》这本书中的顺序来学习。所以我们首先需

挑灯看剑的专栏 1957
下一篇: 使用flex和bison编写计算器
Fan_wcing
博客等级 码龄12年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值