我的编程空间,编程开发者的网络收藏夹
学习永远不晚

简析Linux网络编程函数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

简析Linux网络编程函数

目录
  • 1,创建套接字socket
  • 2,绑定套接字bind
  • 3,创建监听;listen
  • 4,等待连接accept
  • 5, 收发消息send和recv
  • 6,关闭套接字描述符close
  • 7,基于tcp协议的C/S服务器模型
  • 8,实现代码

网络编程的一些基本函数:也是实现tcp协议通讯的基本步骤,实现代码在最后,IP需要修改为自己的IP,即可通信;

1,创建套接字socket

函数原型:


#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);

参数列表:

domain参数有以下这些值

AF_INET:IPv4协议
AF_INET6:IPv6协议
AF_LOCAL:Unix域协议
AF_ROUTE:路由套接口
AF_KEY:密钥套接口

type的值:

SOCKET_STREAM:双向可靠数据流,对应TCP
SOCKET_DGRAM:双向不可靠数据报,对应UDP
SOCKET_RAW:提供传输层以下的协议,可以访问内部网络接口,例如接收和发送ICMP报文

protocol得值:

type为SOCKET_RAW时需要设置此值说明协议类型,其他类型设置为0即可

函数的作用是创建一个指定格式的套接字并返回其描述符,成功返回描述符,失败返回-1;

2,绑定套接字bind

函数原型:


#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

参数列表:

sockfd为之前创建的套接字描述符

my_addr是一个通用套接字结构体指针,在做tcp协议编程时通常使用sockaddr_in结构体

该结构体内容如下;


struct socketaddr_in
{
   unsigned short int sin_family;//对应地址族IP v4填AF_INTE
   uint16_t sin_port;//对应端口号
   struct in_addr sin_addr;//对应ip地址
   unsigned char sin_zero[8];
};
struct in_addr
{
   uint32_t s_addr;
};

addrlen为该上述结构体的大小,可以用sizeof求得;

在使用bind函数前需要先创建一个sockaddr_in类型的结构体,将服务器的信息保存到结构体中,然后将创建的套接字与之绑定;成功返回0,失败返回-1;

在设置端口号和IP时先将结构体清空,如果是主函数传参,那么对应的端口号和ip都是字符串格式,需要用函数转换,转换格式如下:


char port[]="8888"
char ip[]="192.168.1.1"
struct sockaddr_in seraddr'
seraddr.sin_port=htos(atoi(port))
seraddr.sin_addr.s_addr=inet_addr(ip);

3,创建监听;listen

函数原型:


int listen(int fd, int backlog);

参数列表:

fd为要监听的套接字描述符;backlog为监听队列的大小;

(1) 执行listen 之后套接字进入被动模式。

(2) 队列满了以后,将拒绝新的连接请求。客户端将出现连接D 错误WSAECONNREFUSED。

(3) 在正在listen的套接字上执行listen不起作用。

4,等待连接accept

函数原型:


#include <sys/socket.h>
 int accept(int s, struct sockaddr * addr, int * addrlen);

对比bind函数可以发现两者的参数几乎一样,但是accept中的addr不被const修饰,也就是说addr是用来保存连接的客户端的地址信息的,同杨addlen时返回的addr的大小;

所以accept函数的作用就是返回已连接的客户端的文件描述符,并将客户端的地址信息保存在一个新的sockaddr_in结构体中;链接失败返回-1;

5, 收发消息send和recv

函数原型


 int send( SOCKET s, const char FAR *buf, int len, int flags );
int recv( SOCKET s, char FAR *buf, int len, int flags); 

该函数的参数:

  • 第一个参数指定发送/接受端套接字描述符;
  • 第二个参数指明一个存放应用程序要发送数据的缓冲区;
  • 第三个参数指明实际要发送/接收的数据的字节数;
  • 第四个参数一般置0。

send的流程

这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度, 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里);

如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回SOCKET_ERROR)。

recv的流程

这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.

在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调用recv);

在非阻塞模式下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,返回成功拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.

6,关闭套接字描述符close

函数:

close(sockfd);

和文件操作一样,套接字也是一个文件,使用完之后要关闭;

7,基于tcp协议的C/S服务器模型

Linux学习笔记-网络编程(二)

图解tcp模型

8,实现代码

服务端:


#include <stdio

.h> #include <stdlib.h> #include <strings.h> #include <sys/types.h> #include <sys/socket.h>HBNKxYe #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> #include <unistd.h> typedef struct sockaddr_in SIN; typedef struct sockaddr SA; int main(int argc,char *argv[]) { SIN seraddr; SIN cliaddr; int len=sizeof(SIN); //创建监听套接字 int lisfd=socket(AF_INET,SOCK_STREAM,0); if(lisfd<0) { perror("socket"); exit(0); } printf("创建套接字%d成功\n",lisfd); bzero(&seraddr,sizeof(seraddr)); seraddr.sin_family=AF_INET; seraddr.sin_port=htons(8888); seraddr.sin_addr.s_addr=inet_addr("192.168.1.6"); //绑定套接子 int ret=bind(lisfd,(SA*)(&seraddr),len); if(ret<0) { perror("bind"); exit(0); } printf("绑定成功\n"); //开始监听 ret=listen(lisfd,1024); if(ret<0) { perror("listen"); exit(0); } printf("监听成功\n"); //等待连接,将连接的套接字信息保存 int clifd=accept(lisfd,(SA*)(&cliaddr),(socklen_t *)(&len)); if(clifd<0) { perror("accept"); exit(0); } printf("客户端%d连接成功\n",clifd); //读写 char readbuf[1024]={0}; char sendbuf[1024]={0}; while(1) { recv(clifd,readbuf,sizeof(readbuf),0); printf("recv:%s\n",readbuf); fgets(sendbuf,sizeof(sendbuf),stdin); send(clifd,sendbuf,sizeof(sendbuf),0); } //关闭套接字 close(clifd); close(lisfd); return 0; }

客户端:


#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
 
typedef struct sockaddr_in SIN;
typedef struct sockaddr SA;
 
int main(int argc,char *argv[])
{
    SIN seraddr;
    //创建监听套接字
    int serfd=socket(AF_INET,SOCK_STREAM,0);
    if(serfd<0)
    {
        perror("socket");
        exit(0);
    }
    printf("创建套接字%d成功\n",serfd);
    bzero(&seraddr,sizeof(seraddr));
    seraddr.sin_family=AF_INET;
    seraddr.sin_port=htons(8888);
    seraddr.sin_addr.s_addr=inet_addr("192.168.1.6");
    //请求连接
    int ret=connect(serfd,(SA*)(&seraddr),sizeof(SIN));
    if(ret==-1)
    {
        perror("connect");
        exit(0);
    }
    printf("连接成功\n");
    //读写
    char senbuf[1024]={0};
    char readbuf[1024]={0};
    while(1)
    {
        fgets(senbuf,sizeof(senbuf),stdin);
        send(serfd,senbuf,sizeof(senbuf),0);
        recv(serfd,readbuf,sizeof(readbuf),0);
        printf("recv:%s\n",readbuf);
    }
    //关闭套接字
    close(serfd);
    return 0;
}

到此这篇关于简析linux网络编程函数的文章就介绍到这了,更多相关Linux网络编程函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

简析Linux网络编程函数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

简析Linux网络编程函数

目录1,创建套接字socket2,绑定套接字bind3,创建监听;listen4,等待连接accept5, 收发消息send和recv6,关闭套接字描述符close7,基于tcp协议的C/S服务器模型8,实现代码网络编程的一些基本函数:也是
2022-06-04

学习Linux网络编程基本函数

目录1,创建套接字socket函数原型:参数列表:type的值:protocol得值:2,绑定套接字bind函数原型:参数列表:3,创建监听;listen函数原型:参数列表:4,等待连接accept函数原型:5, 收发消息send和recv
2022-06-04

如何使用linux网络编程用到的网络函数

本篇内容主要讲解“如何使用linux网络编程用到的网络函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用linux网络编程用到的网络函数”吧!一.概念介绍网络程序分为服务端程序和客户端程
2023-06-09

C/C++ Linux Socket网络编程流程分析

这篇文章主要介绍了C/C++ Linux Socket网络编程,Linux环境中的C/C++ socket 与Window环境中的C/C++ socket类似,本文所记录的是TCP协议的socket编程,图文实例相结合给大家介绍的非常详细,需要的朋友可以参考下
2023-02-06

MFC网络编程简单例程

目录 一、关于网络的部分概念1 URL(网址)及URL的解析2 URL的解析3 域名及域名解析3 IP及子网掩码4 什么是Web服务器5 HTTP的基本概念6 Socket库概念7 协议栈8 Socket库收发数据基本步骤 二、
2023-08-30

linux网络编程用到的网络函数详解用和使用示例

一.概念介绍网络程序分为服务端程序和客户端程序。服务端即提供服务的一方,客户端为请求服务的一方。但实际情况是有些程序的客户端、服务器端角色不是这么明显,即互为客户端和服务端。我们编写网络程序时,一般是基于TCP协议或者UDP协议进行网络通信
2022-06-04

[python网络编程]socket的简

1 socket基本参数了解1.在建立socket对象的时候,需要告诉系统两件事情1.1 通信的类型是什么(IPv4/IPv6等)1.2 使用的协议是什么?(TCP/UDP等)2.各个通信类型和协议的标识2.1 IPv4:AF_INET2.
2023-01-31

python网络编程--socket简单

python网络编程                                                                                                              
2023-01-31

C++ 函数在网络编程中如何处理网络事件?

c++++ 中使用 select() 函数处理网络事件的方法如下:使用 fd_set 声明文件描述符集合,并初始化它们设置超时时间使用 select() 函数监控文件描述符的事件检查 select() 的返回值:-1 表示错误,0 表示超时
C++ 函数在网络编程中如何处理网络事件?
2024-04-27

C++ 函数在网络编程中如何实现网络安全?

c++++ 函数在网络编程中可实现网络安全,方法包括:1. 使用加密算法(openssl)加密通信;2. 使用数字签名(cryptopp)验证数据完整性和发送方身份;3. 防御跨站脚本攻击(htmlcxx)过滤和消毒用户输入。C++ 函数在
C++ 函数在网络编程中如何实现网络安全?
2024-04-28

C++ 函数在网络编程中如何实现网络路由?

在网络编程中,c++++ 函数可以通过使用 sockets 实现路由。首先,使用 socket() 函数创建 sockets,指定域、类型和协议。然后,使用 connect() 和 bind() 函数将本地 socket 分别连接到目标主机
C++ 函数在网络编程中如何实现网络路由?
2024-04-26

C++ 函数在网络编程中如何实现网络嗅探?

c++++ 中的网络嗅探可以通过 pcap 库实现。使用 pcap_lookupdev(null) 查找网络适配器,pcap_open_live() 打开嗅探接口,pcap_loop() 监听数据包,并使用回调函数(例如 packet_ha
C++ 函数在网络编程中如何实现网络嗅探?
2024-04-26

C++ 函数在网络编程中如何处理网络协议?

c++++ 标准库提供以下函数处理网络协议:socket(): 创建新的网络套接字描述符。connect(): 将套接字连接到远程地址和端口。send()/recv(): 发送或接收数据包。listen(): 在指定端口上侦听传入连接。ac
C++ 函数在网络编程中如何处理网络协议?
2024-04-27

C++ 函数库如何进行网络编程?

c++++ 库中网络编程通过库提供套接字 api、boost.asio 和 qt network 等功能。实战案例展示了使用 berkeley 套接字 api 构建 tcp 服务器的步骤:1. 包含头文件;2. 创建套接字;3. 绑定套接字
C++ 函数库如何进行网络编程?
2024-04-18

PHP 函数的网络编程高级应用

如何利用 php 函数进行高级网络编程?构建 restful api:可通过函数处理get/post/put/delete请求,使用header()/json_encode()返回json响应。其它高级应用:实现web套接字、异步请求、文件
PHP 函数的网络编程高级应用
2024-04-22

C++ 函数在网络编程中如何实现网络防火墙?

使用 c++++ 函数可以轻松在网络编程中实现网络防火墙,具体步骤如下:编写检查数据包有效性的函数:验证源 ip 地址是否允许验证端口号是否允许验证数据包类型是否允许编写处理数据包的函数:允许有效数据包通过丢弃无效数据包创建防火墙对象并配置
C++ 函数在网络编程中如何实现网络防火墙?
2024-04-26

如何使用C++中的网络编程函数?

如何使用C++中的网络编程函数?在现代社会中,网络已经成为了人们生活中不可或缺的一部分。在软件开发领域中,网络编程更是其中的重要组成部分。C++作为一种强大的编程语言,提供了丰富的网络编程函数和库,使得开发者可以轻松地构建各种网络应用程序。
如何使用C++中的网络编程函数?
2023-11-18

linux网络编程socket的介绍

这篇文章主要讲解了“linux网络编程socket的介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux网络编程socket的介绍”吧!一.概念介绍网络程序分为服务端程序和客户端程序
2023-06-13

Ruby与Linux网络编程实践

Ruby 是一种动态、面向对象的编程语言,而 Linux 是一种广泛使用的类 Unix 操作系统Ruby 的 Socket 库Ruby 的 Socket 库提供了一组丰富的方法和类,用于实现各种网络通信功能。以下是一个简单的 Ruby So
Ruby与Linux网络编程实践
2024-09-10

编程热搜

目录