首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >百问FB网络编程 - 主要函数介绍

百问FB网络编程 - 主要函数介绍

作者头像
阿志小管家
发布于 2024-12-05 00:18:56
发布于 2024-12-05 00:18:56
15100
代码可运行
举报
运行总次数:0
代码可运行

6.3 网络编程主要函数介绍

下面全部函数的头文件都是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <sys/types.h>
#include <sys/socket.h>
6.3.1 socket函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int socket(int domain, int type,int protocol);

此函数用于创建一个套接字。

domain是网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等)。

AF_UNIX只能够用于单一的Unix 系统进程间通信,而AF_INET是针对Internet的,因而可以允许远程通信使用。

type是网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等)。

SOCK_STREAM表明用的是TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流。

SOCK_DGRAM 表明用的是UDP协议,这样只会提不可靠,无连接的通信。

关于protocol,由于指定了type,所以这个地方一般只要用0来代替就可以了。

此函数执行成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况。

6.3.2 bind函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

从函数用于将地址绑定到一个套接字。一台电脑上可能有多个IP和端口,这个套接字要绑定到哪个IP和端口需要用bind函数来绑定。

sockfd是由socket函数调用返回的文件描述符。

my_addr是一个指向sockaddr的指针。

addrlen是sockaddr结构的长度。

sockaddr的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct sockaddr{
unisgned short  as_family;
char sa_data[14];                  // 这14个字节里面,含有 IP 和 端口,但是不明显
};

不过由于系统的兼容性,我们一般使用另外一个结构(struct sockaddr_in) 来代替。

sockaddr_in的定义: sockaddrsockaddr_in 结构体的大小是完全一样的,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct sockaddr_in{
unsigned short          sin_family;     
unsigned short          sin_port;          // 2字节   表示端口
struct in_addr          sin_addr;          // 4字节   表示IP地址
unsigned char           sin_zero[8];       // 8字节   不用  2+4+8=14字节,和上面那个结构体一样
}

如果使用Internet所以sin_family一般为AF_INET。

sin_addr还是一个结构体,sin_addr.s_addr 设置为INADDR_ANY表示可以和主机的所有IP通信,也就是监测所有的IP。

sin_port是要监听的端口号。要使用 htons(SERVER_PORT) 端口号转换为网络字节序

bind将本地的端口同socket返回的文件描述符捆绑在一起.

成功是返回0,失败的情况和socket一样,返回 -1。

6.3.3 listen函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int listen(int sockfd,int backlog);

此函数宣告服务器可以接受连接请求。

sockfd是bind后的文件描述符。

backlog设置请求排队的最大长度。当有多个客户端程序和服务端相连时,使用这个表示可以介绍的排队长度。

listen函数将bind的文件描述符变为监听套接字。

成功是返回0,失败的情况和socket一样,返回 -1。

6.3.4 accept函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int accept(int sockfd, struct sockaddr *addr,int *addrlen);

服务器使用此函数获得连接请求,并且建立连接。

sockfd是listen后的文件描述符。

addraddrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了, bind,listen和accept是服务器端用的函数。

accept调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接。

accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了,失败时返回-1 。

(可以认为这个描述符是这个客户端的象征,之后接收发送就向该描述符操作)

问:如何把客户端的IP地址转换为我们常见的形式?

答:inet_ntoa(sockaddr.sin_addr) 把这个 sin_addr 转换为 ascii 格式的字符串

6.3.5 connect函数

对于TCP的连接,这里会有3次握手

对于UDP的连接,这里是虚假的连接,目的只是为了获得IP地址这些数据而已

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int connect(int sockfd, struct sockaddr * serv_addr,int addrlen);

可以用connect建立一个连接,在connect中所指定的地址是想与之通信的服务器的地址。

sockfd是socket函数返回的文件描述符,客户端的文件描述符。

serv_addr储存了服务器端的连接信息,其中sin_add是服务端的地址。

addrlen是serv_addr的长度。

connect函数是客户端用来同服务端连接的

成功时返回0,sockfd是同服务端通讯的文件描述符(客户端),失败时返回-1。

6.3.6 send函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ssize_t send(int sockfd, const void \*buf, size_t len, int flags);

sockfd 指定发送端套接字描述符;

buf 指明一个存放应用程序要发送数据的缓冲区;

len 指明实际要发送的数据的字节数;

flags 一般置0。

客户或者服务器应用程序都用send函数来向TCP连接的另一端发送数据

6.3.7 recv函数

【没有数据会休眠】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

sockfd 指定接收端套接字描述符;

buf 指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;

len 指明buf的长度,也就是最多可以接收多少字节的数据;

flags 一般置0。

客户或者服务器应用程序都用recv函数从TCP连接的另一端接收数据。

返回值:平时会阻塞,有数据就返回实际接收到了多少个数据

​ if(iRecvLen <= 0) // 则表示出错了

6.3.8 recvfrom函数(UDP)

【没有数据会休眠】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

				struct sockaddr *src_addr, socklen_t *addrlen);

recvfrom通常用于【无连接】套接字,因为此函数可以获得发送者的地址。

src_addr 是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。

addrlen 常置为sizeof (struct sockaddr)。

6.3.9 sendto函数(UDP)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

			   const struct sockaddr *dest_addr, socklen_t addrlen);

sendto和send相似,区别在于sendto允许在无连接的套接字上指定一个目标地址。

dest_addr 表示目地机的IP地址和端口号信息,

addrlen 常常被赋值为sizeof (struct sockaddr)。注意这个不是传入地址了。

sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。

6.3.10 close函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
close(iSocketClient);
6.3.11 辅助函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <arpa/inet.h>

// 将 short 类型的整型端口号转换为 sockaddr_in 中的 sin_port 类型的网络端口号
// 将主机字节顺序转换为网络字节顺序
uint16_t htons(uint16_t hostshort);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

// 将 IP 地址结构体转换为 ascii码常见格式
char *inet_ntoa(struct in_addr in);

$ ./a.out 226.000.000.037      # Last byte is in octal
226.0.0.31
$ ./a.out 0x7f.1               # First byte is in hex
127.0.0.1
    
// 参数1:cp 就是 192.168.1.1 这种格式的IP地址字符串
// 参数2:inp 就是 struct in_addr 格式的IP地址,也就是 
int inet_aton(const char *cp, struct in_addr *inp);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
socket网络编程(一)——初识socket
出现一项技术,首先我们弄懂一下,为什么要出现。那么为什么要出现socket这玩意呢?可以很简单的用一句话来概括:
一点sir
2024/01/10
5410
socket网络编程(一)——初识socket
【网络编程系列】二:socket通信原理及实践
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下: 1、网络中进程之间如何通信? 2、Socket是什么? 3、socket的基本操作 3.1、socket()函数 3.2、bind()函数 3.3、l
老白
2018/03/19
1.9K0
【网络编程系列】二:socket通信原理及实践
C++中的socket编程常用接口
socket() 函数是进行网络编程的基础,它用于创建一个新的套接字(socket)。套接字是网络通信的端点,可以用于在不同计算机之间传输数据。下面是对 socket() 函数的详细解释:
薄荷冰
2024/07/19
4550
【计算机网络】Linux下简单的UDP服务器(超详细)
我们把服务器封装成一个类,当我们定义出一个服务器对象后需要马上初始化服务器,而初始化服务器需要做的第一件事就是创建套接字。
咬咬
2025/06/02
2110
【计算机网络】Linux下简单的UDP服务器(超详细)
网络编程打开的第一节预备课-----关于socket
传统的进程间通信借助内核提供的 IPC 机制进行, 但是只能限于本机通信, 若 要跨机通信, 就必须使用网络通信,比如之前在操作系统学习到的pipe通信,这是一个本机通信,是最基本的IPC机制进行的。
莫浅子
2023/11/09
2490
网络编程打开的第一节预备课-----关于socket
SOCKET网络编程 (通俗易懂入门篇)
struct sockaddr :很多网络编程函数的出现早于IPV4协议,为了向前兼容,现在sockaddr都退化成(void *)结构了。 传递一个地址给函数,然后由函数内部再强制类型转换为所需的地址类型。
看、未来
2020/08/25
1.4K0
SOCKET网络编程 (通俗易懂入门篇)
【Linux网络编程】Socket编程--UDP:实现服务器接收客服端的消息
<font color= black face="楷体" size=3><center>🌈个人主页:南桥几晴秋
南桥
2024/10/24
3670
【Linux网络编程】Socket编程--UDP:实现服务器接收客服端的消息
【Linux】: Socket 编程
但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过启动的 qq,迅雷,浏览器。 而启动的 qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把数据给进程,人就相当于就拿到了数据。
IsLand1314
2025/01/09
1.1K0
【Linux】: Socket 编程
TCP编程入门简介
在前几篇文章中,我们先从宏观角度(TCP 概述)大致介绍了 tcp 的概念,然后从微观角度(滑动窗口、拥塞窗口等)详细说明了从 client 端和 server 端,tcp 是如何进行网络控制的。在本文中,我们将通过一个 tcp 例子,将整个过程联通起来,讲解 tcp 从连接、发送以及关闭,整个流程是怎样运行的。
高性能架构探索
2022/08/25
3940
TCP编程入门简介
Linux应用开发【第六章】网络编程应用开发
​ 要编写通过计算机网络通信的程序,首先要确定这些程序同通信的协议(protocol),在设计一个协议的细节之前,首先要分清程序是由哪个程序发起以及响应何时产生。
韦东山
2021/12/15
1.5K0
Linux应用开发【第六章】网络编程应用开发
UDP&TCP Linux网络应用编程详解
暂时想不出什么好的应用场景, 目前想到目标就是实现让两个设备通过网络传输数据, 比如开发板和Linux主机之间传数据, 以后就可以实现开发板通过网络上报数据或者主机通过网络控制开发板。
韦东山
2020/09/30
6.1K0
UDP&TCP Linux网络应用编程详解
【网络编程】Linux网络编程基础与实战第二弹——Socket编程
Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。
洁洁
2023/10/19
6090
【网络编程】Linux网络编程基础与实战第二弹——Socket编程
C语言实现Socket简单通信
https://www.cnblogs.com/Dukefish/p/9197830.html
C语言中文社区
2022/05/30
8030
领航Linux UDP:构建高效网络新纪元
在前几篇博客中,我们学习了Linux网络编程中的一些概念。从本篇博客开始,我们就正式开始写代码。本篇博客我们将写udp服务器和客户端代码,并实现服务器和客户端通信。这些代码学习成本较高,建议大家多敲几遍。如任何问题,欢迎与我沟通。
破晓的历程
2024/08/20
3790
领航Linux UDP:构建高效网络新纪元
【Socket】Socket相关概念及函数
Socket中文意思是"插座",在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。
半生瓜的blog
2023/05/13
1K0
【Socket】Socket相关概念及函数
【C++】基础:网络编程介绍与TCP&UDP示例
网络传输模型可以抽象为7个层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
DevFrank
2024/07/24
6960
【C++】基础:网络编程介绍与TCP&UDP示例
linux网络编程系列(三)--tcp和udp的基本函数调用过程及如何选择
TCP是TCP/IP体系中面向连接的传输层协议,它提供全双工和可靠交付的服务。它采用许多机制来确保端到端结点之间的可靠数据传输,如采用序列号、确认重传、滑动窗口等。
cpp加油站
2021/04/16
1.1K0
linux网络编程系列(三)--tcp和udp的基本函数调用过程及如何选择
Linux下Socket编程入门
网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节序采用big endian排序方式。
_咯噔_
2022/02/23
4K0
【Linux网络】Linux网络编程套接字,UDP与TCP
前言:在当今这个信息技术日新月异的时代,网络编程已成为连接世界、构建各类互联网应用不可或缺的一部分。而Linux,作为开源操作系统的典范,其强大的网络功能和灵活性,为开发者们提供了一个广阔而深入的实践平台。在众多网络编程技术中,套接字(Socket)编程无疑是核心与基石,它不仅支撑着Web服务、即时通讯、在线游戏等日常应用,还是实现分布式系统、云计算服务的关键技术之一。
Eternity._
2024/11/18
9040
【Linux网络】Linux网络编程套接字,UDP与TCP
C语言网络编程:从入门到精通,一篇文章彻底搞懂
Socket接口主要工作在传输层和网络层,屏蔽了底层硬件和路由细节,让开发者可直接通过“端口+IP”定位目标进程。
C语言中文社区
2025/07/17
5670
C语言网络编程:从入门到精通,一篇文章彻底搞懂
推荐阅读
相关推荐
socket网络编程(一)——初识socket
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档