Socket:套接字网络编程(C++)

网络通信编程

网络通信socket

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口

计算机是通过TCP/IP协议进行互联从而进行通信的,为将TCP/IP协议进行隐藏,引出套接字这个概念

套接字可以看成IP地址与端口号的组合
套接字提供了流套接字与数据报套接字两种组合

  • 流套接字基于TCP(stream)
  • 数据报套接字基于UDP(datagram)

网络通信的过程

C/S模式的交互过程如下所示

在这里插入图片描述

C++网络编程常用API

  1. 创建套接字:int socket(int family,int type,int protocol);
  2. 流程

在Windows环境下进行开发套接字系统

WinSock DLL

初始化WinSock DLL

int WSAStartup(

WORD wVersionRequested,              //调用者能使用的Windows Socket支持的最高版本。高位指定副版本,低位指定主版本号

LPWSADATA lpWSAData                   //指向WSADATA的指针,用于接收Windows Socket的实现细节

);

//该函数在一个进程中初始化WS2_32.dll的使用

释放WinSock DLL资源

int WSACleanup(void);

socket相关函数

socket()函数

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

socket()用于创建一个socket描述符,它标识socket。能用它作为参数。进行一些读写操作。
socket()函数有三个参数,分别为:

  1. domain:协议域,又称为协议族。
  2. type:指定socket类型
  3. protocol:协议

blind()函数

blind()函数把一个地址族中的特定地址赋给socket。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

blind()函数有三个参数,分别为:

  1. sockfd:socket描述字,它是通过socket()函数创建的,标识唯一一个socket
  2. addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同
  3. addrlen:对应的是地址的长度。

listen(),connect()函数

服务器在调用了socket()与blind()之后会调用listen()来监听这个socket(),当客户端发出connect()时,服务器端会收到这个请求。

int listen(int sockfd, int backlog);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);


listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。

connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。

accept()函数

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept函数的第一个参数为服务器的socket描述字,第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。

send(),recv()函数

int send(
SOCKET s,                  //标识一个已经建立连接套接字的描述符
const char*buf,         //包含待传输数据的缓冲区
int len,                       //buf中数据的长度
int flags                    
);
//send函数在一个已建立连接的套接字上发送数据


int recv(
SOCKET s,                    //标识一个已建立连接套接字的描述符
char*buf,                  //接收传来的数据的缓冲区   
int len,                    //缓冲区长度
int flags
);
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Socket网络编程是一种在计算机网络中进行数据交互的编程方式。通过使用Socket,我们可以在不同的计算机之间建立网络并进行数据传输。 在C语言中,我们可以使用标准库中的socket函数来创建一个Socket。首先,我们需要使用socket函数来创建一个Socket,指定协议和类型。然后,使用bind函数将Socket与一个本地地址绑定,通常是一个IP地址和一个端口号。着,使用listen函数启动Socket的监听模式,等待其他计算机发起连请求。 一旦有其他计算机发起连请求,我们可以使用accept函数来受连,并返回一个新的Socket文件描述符,这个新的Socket可以用于与对方进行数据交互。在这之后,我们可以使用send和recv函数来发送和收数据。 当数据发送完毕或收完毕后,我们可以使用close函数关闭Socket,释放资源。在进行Socket网络编程时,我们还可以使用select函数来实现多路复用,同时监听多个Socket,提高程序的效率。 在Socket网络编程中,还可以使用一些其他的函数来设置Socket的各种属性,例如设置Socket为非阻塞模式,设置等待时间等。 总之,Socket网络编程提供了一个方便的方式来进行网络通信。通过使用Socket函数及其相关函数,我们可以在C语言中轻松实现网络编程,实现不同计算机之间的数据交互。 ### 回答2: c socket网络编程是一种用C语言编写的网络编程技术,它允许计算机之间通过网络进行通信和数据交换。在C语言中,socket函数库提供了一种方便的方式来创建网络应用程序。 使用C socket网络编程,我们可以通过创建一个套socket)来建立与其他计算机的连。套可以视为两个应用程序之间的通信端口。一个应用程序可以充当服务器(server),等待其他应用程序的连请求,并受它们的连。另一个应用程序可以充当客户端(client),向服务器发送连请求,并与服务器建立连。一旦连建立,我们可以在客户端和服务器之间传递数据。 在进行C socket网络编程时,我们需要使用一些重要的函数,如socket、bind、listen、accept、connect和send/recv等。其中,socket函数用于创建一个套,bind函数用于将套与本地IP地址和端口绑定,listen函数用于在服务器端开始监听连请求,accept函数用于受客户端的连请求,connect函数用于与服务器建立连,send/recv函数用于在已经建立的连上发送和收数据。 C socket网络编程在实际应用中具有广泛的用途。它可以用于开发各种类型的网络应用程序,如网络聊天室、网络游戏、文件传输、远程控制等。通过使用C socket网络编程技术,我们可以轻松地实现不同计算机之间的通信和数据交换,为用户提供更好的网络体验。 ### 回答3: C语言的socket网络编程是指利用socket库函数,通过TCP/IP协议或UDP协议在网络上进行数据通信的一种编程方式。 在C语言中,可以使用socket()函数创建一个套,该函数返回一个整数值作为套的标识符。创建套后,可以使用bind()函数将套与本地的IP地址和端口号绑定起来。 对于服务器端程序,可以使用listen()函数设置套为监听状态,然后通过accept()函数受客户端的连请求。 对于客户端程序,可以使用connect()函数连到服务器端的套。连成功后,客户端可以使用send()函数发送数据给服务器端,也可以使用recv()函数收服务器端发送过来的数据。 在网络编程中,需要注意错误处理。例如,当创建套或者连失败时,需要使用perror()函数输出错误信息,并且使用close()函数关闭套。此外,还需要使用htons()和htonl()函数将主机节序转换为网络节序,以及使用ntohs()和ntohl()函数将网络节序转换为主机节序。 socket网络编程还可以使用多线程或多进程实现并发处理,可以同时处理多个连请求,提高服务器的并发性能。 总之,C语言的socket网络编程是一种强大的工具,用于在网络上进行数据通信。它可以使程序与程序之间实现数据的传输和通信,方便地实现分布式系统、网络游戏、即时通信等应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Balette

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值