首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在服务器端和客户端调用recv和send函数时都要使用客户端的文件描述符?

在服务器端和客户端进行网络通信时,recvsend 函数是用于接收和发送数据的系统调用。这两个函数都需要使用文件描述符(file descriptor)来指定要进行通信的套接字(socket)。以下是关于为什么在这两个场景中都要使用客户端的文件描述符的基础概念和相关解释:

基础概念

  1. 文件描述符:在Unix和类Unix系统中,文件描述符是一个非负整数,用于标识打开的文件或其他输入/输出资源,如套接字。当一个进程打开一个文件或创建一个套接字时,操作系统会返回一个文件描述符。
  2. 套接字:套接字是一种通信端点,允许不同计算机上的进程通过网络进行通信。在TCP/IP协议栈中,套接字用于实现客户端和服务器之间的连接。

为什么使用客户端的文件描述符

  • 标识通信端点:文件描述符唯一标识了一个打开的套接字,无论是服务器端还是客户端。通过使用文件描述符,操作系统能够追踪和管理每个进程的网络通信状态。
  • 进程隔离:每个进程都有自己的文件描述符表,这意味着不同进程可以使用相同的文件描述符值来引用不同的文件或套接字。这种隔离确保了一个进程的操作不会影响到其他进程。
  • 资源管理:操作系统通过文件描述符来管理资源,如内存和网络带宽。当进程不再需要某个文件描述符时,它可以关闭该描述符,从而释放与之关联的资源。

应用场景

  • 服务器端:服务器通常需要监听多个客户端的连接。每个客户端连接都会创建一个新的套接字,并分配一个唯一的文件描述符。服务器使用这些文件描述符来接收和发送数据。
  • 客户端:客户端在与服务器建立连接后,也会获得一个文件描述符。客户端使用这个文件描述符来发送请求到服务器,并接收服务器的响应。

示例代码

以下是一个简单的TCP客户端和服务器示例,展示了如何使用recvsend函数以及文件描述符:

服务器端代码示例

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);

    // 创建套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 绑定套接字
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    // 接受连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    // 接收数据
    char buffer[1024] = {0};
    int valread = recv(new_socket, buffer, 1024, 0);
    printf("Received: %s\n", buffer);

    // 发送数据
    send(new_socket, "Hello from server", strlen("Hello from server"), 0);

    // 关闭套接字
    close(new_socket);
    close(server_fd);

    return 0;
}

客户端代码示例

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";
    char buffer[1024] = {0};

    // 创建套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);

    // 转换IP地址
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }

    // 连接服务器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }

    // 发送数据
    send(sock, hello, strlen(hello), 0);

    // 接收数据
    int valread = recv(sock, buffer, 1024, 0);
    printf("Received: %s\n", buffer);

    // 关闭套接字
    close(sock);

    return 0;
}

遇到问题的原因及解决方法

问题:如果在调用recvsend时遇到错误,可能是由于以下原因之一:

  • 套接字未正确初始化:确保套接字已成功创建并绑定。
  • 连接未建立:在客户端,确保已成功连接到服务器。
  • 资源限制:可能是由于系统资源限制,如文件描述符数量限制。

解决方法

  • 检查套接字创建、绑定和连接的状态。
  • 使用perror函数打印错误信息,以便诊断问题。
  • 调整系统资源限制,例如增加允许的最大文件描述符数量。

通过理解这些基础概念和正确使用文件描述符,可以有效地进行网络通信,并解决在开发过程中可能遇到的问题。

相关搜索:为什么使用和不使用"new“调用函数时,"this”的工作方式不同?在Rails6中如何使用Webpacker在多个客户端JavaScript文件之间共享变量和函数?为什么在命令模式中没有从客户端到接收器和调用器的依赖箭头?在使用Webapp和桌面客户端(使用测量协议)时,在Google Analytics中识别相同的用户在使用Springboot和feign客户端进行rest调用时,获取响应中的选择性字段为什么在fortran中使用函数和contains时总是得到相同的结果在Authorization header中传递客户端Id和客户端密码时,是否可以使用Base64以外的任何其他编码在vscode中使用maven和java时,为什么找不到为grpc和protobuf生成的源文件?为什么不传输(保存)文件?通过tcp在C#中的客户端和C中的服务器之间进行正确的连接?如何使用内存映射文件在同一台计算机上的服务器和客户端之间进行通信?当文件位于不同的文件夹中时,如何在nodeJS应用程序中使用concurently同时运行服务器和客户端使用java JLayer的背景音乐可以在eclipse和runnable jar中播放,但不能在客户端下载并运行它时播放为什么我的Flutter CustomPainter类在使用canvas..drawArc()函数和小于2*pi的sweepAngle时没有在屏幕上绘制任何内容?为什么在使用helper函数和使用字符串插值或连接时,我会得到两种不同的结果,最小的断言相等为什么在使用HTTP Accept-Ranges提供大文件服务时,不能满足PHP的"memory_limit“和"max_execution_time”限制?我有一个JS列表函数,它可以在使用内联脚本时工作,但不能在HTML和JS位于不同的文件中时工作
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++中的socket编程常用接口

bind() 函数在服务器端使用较多,客户端通常不需要显式调用这个函数,因为操作系统会在 connect() 函数调用时自动选择一个合适的端口。...调用 connect() 时,客户端的套接字必须已经使用 socket() 函数创建。...六、recv recv() 函数用于在连接建立后从套接字接收数据。它通常用于从服务器或客户端接收数据,可以在服务器端和客户端的通信中使用。...八、send send() 函数用于向套接字发送数据。它与 recv() 对应,通常在服务器端和客户端的通信中使用。...十一、fcntl fcntl 函数在 Unix 系统中用于对文件描述符进行各种控制操作,包括设置非阻塞模式、获取和设置文件描述符标志等。在网络编程中,它通常用于设置套接字的非阻塞模式。

14110

Linux的SOCKET编程详解

当进程打开一个文件时,系统把一个指向此文件内部数据结构的指针写入文件描述符表,并把该表的索引值返回给调用者 。应用程序只需记住这个描述符,并在以后操作该文件时使用它。...应用程序创建套接字后在该套接字可以使用之前,必须调用其他的过程来填充这些字段。 3、文件描述符和文件指针的区别: 文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。...文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。

8.4K10
  • 网络中进程之间如何通信?

    内核通过文件描述符来索引一个进程打开的文件。当你需要读或写一个文件时,你需要用文件描述符来标记它。 网络中的进程通信 在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...当应用程序调用recv函数时, 1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR; 2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后...注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。...close() 函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

    63220

    socket知识点分享

    ,在调用了accept()函数后,默认是阻塞进程的,直到有一个客户端请求连接,连接成功后返回一个新的socket描述符,此后,服务器端即可使用这个新的socket描述符与该客户端进行通信了,而旧的socket...客户端说明:客户端通过调用connect()连接指定服务端socket时,将会发起一个连接请求的同步序列编号(SYN:是TCP/IP建立连接时的握手信号),服务器端在接收到客户端发送过来的连接请求的时候会将请求方放进...SYN队列里,并且给客户端回复一个ACK+SYN,这称为第二次握手,客户端在收到ACK+SYN之后,connect将返回,并发送确认连接帧ACK给服务器端,这是第三次握手,服务端收到ACK帧后,会将请求方从...read()/recv()读取数据时: (1).当使用read()/recv()读取输入缓冲区数据的时候,如果输入缓冲区没有数据,那么read()/recv()将会被阻塞,直到输入缓冲区中有数据可用读取..., int len, int flags ); /** 使用recv函数从TCP连接的另一端接收数据。

    57740

    Linux的SOCKET编程详解

    TCP/IP协议存在于OS中,网络服务通过OS提供,在OS中增加支持TCP/IP的系统调用——Berkeley套接字,如Socket,Connect,Send,Recv等 UDP(User Data...当进程打开一个文件时,系统把一个指向此文件内部数据结构的指针写入文件描述符表,并把该表的索引值返回给调用者 。应用程序只需记住这个描述符,并在以后操作该文件时使用它。...应用程序创建套接字后在该套接字可以使用之前,必须调用其他的过程来填充这些字段。 3、文件描述符和文件指针的区别: 文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。

    2.6K10

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

    一台电脑上可能有多个IP和端口,这个套接字要绑定到哪个IP和端口需要用bind函数来绑定。 sockfd是由socket函数调用返回的文件描述符。 my_addr是一个指向sockaddr的指针。...backlog设置请求排队的最大长度。当有多个客户端程序和服务端相连时,使用这个表示可以介绍的排队长度。 listen函数将bind的文件描述符变为监听套接字。...sockfd是listen后的文件描述符。 addr,addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了, bind,listen和accept是服务器端用的函数。...accept调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接。 accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了,失败时返回-1 。...connect函数是客户端用来同服务端连接的 成功时返回0,sockfd是同服务端通讯的文件描述符(客户端),失败时返回-1。

    7410

    Python中TCP协议的理解

    而四次挥手是:当一个客户端主动发送断开close()请求时,服务器端却可以接收别的请求;要想真正的结束,那么服务器端就需要被动的调用断开close()。...8,在TIME_WAIT状态 时两端的端口不能使用,要等到2MSL时间结束才可继续使用。 9,当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。...这些设备的文件描述符被放在一个数组中,然后select调用的时候遍历这个数组,如果对于文件描述符可读则会返回该文件描述符。...只有活跃可用的FD才会调用callback函数;即epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll。...下次调用epoll时,会再次响应应用程序并通知此事件。 ET模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。

    91920

    谈谈SOCKET

    2.如何使用socket ? 先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。 write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节 数。...其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

    71220

    socket网络编程(一)——初识socket

    这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...3.4、accept()函数 TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。...read()/write()和recv()/send这两组函数,当然其他的也是可以的。...write函数将buf中的nbytes字节内容写入文件描述符fd。成功时返回写的字节数,失败时返回-1,并设置errno变量。 在网络程序中,当我们向套接字文件描述符写时有两种可能。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

    36410

    Linux应用开发【第六章】网络编程应用开发

    此函数执行成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况。...backlog设置请求排队的最大长度。当有多个客户端程序和服务端相连时,使用这个表示可以介绍的排队长度。 listen函数将bind的文件描述符变为监听套接字,返回的情况和bind一样。...sockfd是listen后的文件描述符。 addr,addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了, bind,listen和accept是服务器端用的函数。...accept调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接。 accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了,失败时返回-1 。...addrlen是serv_addr的长度 connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符,失败时返回-1。

    1.3K31

    socket原理讲解_电感器的作用及原理

    TCP/IP协议存在于OS中,网络服务通过OS提供,在OS中增加支持TCP/IP的系统调用——Berkeley套接字,如Socket,Connect,Send,Recv等 UDP(User Data...当进程打开一个文件时,系统把一个指向此文件内部数据结构的指针写入文件描述符表,并把该表的索引值返回给调用者 。应用程序只需记住这个描述符,并在以后操作该文件时使用它。...应用程序创建套接字后在该套接字可以使用之前,必须调用其他的过程来填充这些字段。 3、文件描述符和文件指针的区别: 文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。

    33210

    Tcp协议Socket编程

    sockfd参数:文件描述符。 addr参数: 是一个输出型参数,accept()返回时传出客户端的地址和端口号,如果给 addr 参数传 NULL,表示不关心客户端的地址。...IP进行通信,所以将来服务器端在启动时就可以通过....(文件描述符不归还) }   服务完成就必须要关闭文件描述符,不然就是导致文件描述符泄漏,我们在系统部分学习过,文件描述符也是有限的,如果我们每一次对客户端的sockfd不归还势必会导致资源的浪费,也就是...,今天我们不做过多的处理,仅仅作为一个聊天室存在,从命令行获取信息,并且发送到服务器端,而在Tcp服务里面,我们更喜欢使用的发送消息的接口是send,收消息使用recv: ssize_t send(int...不同的是recv和send不需要sockaddr结构体字段,也就是不需要对端的网络ip和port,这是因为调用recv和send之前已经与对端建立了链接,所以直接使用recv和send来进行通信即可。

    5400

    深入剖析Linux网络设计中网络IO的重要角色

    ENOTSOCK 文件描述符sockfd不引用套接字。 EPROTOTYPE 套接字类型不支持请求的通信协议。例如,在尝试将UNIX域数据报套接字连接到流套接字时,可能会发生此错误。...EAGAIN sockfd引用的套接字以前未绑定到地址,在尝试将其绑定到临时端口时,确定临时端口范围内的所有端口号当前都在使用中。 EBADF 指定的描述符无效。...在非阻塞模式中,完成socket()、bind()、listen()的调用后,会循环调用accept()函数,如果返回值大于0,表示获取到一个已完成连接的客户端。...例如: IO函数 IO操作功能 IO检测功能 accept 从全连接队列中取出一个已完成连接的节点,并返回内核自动生成文件描述符以及客户端的ip地址和端口等信息 检测全连接队列中是否有已完成的连接的节点...当客户端发送数据到服务器的读缓冲区时,会发送信号给epoll(IO多路复用器),epoll(IO多路复用器)就会触发读事件,说明读缓冲区填充有数据;此时就可以调用recv/read函数操作IO。

    11620

    python之socket编程

    Python 官方关于 Socket 的函数请看 http://docs.python.org/library/socket.html socket和file的区别:   1、file模块是针对某个指定文件进行...服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。...通常是一个元组(ipaddr,port) sk.fileno()   套接字的文件描述符 以下是例子: 例子1: 简单的服务器和客户端之间进行通讯 service端: """ file: service.py...socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 6666)) # 服务器和客户端在不同的系统或不同的主机下时使用的...ip和端口,首先要查看服务器所在的系统网卡的ip # s.connect(('127.0.0.1', 6666)) #服务器和客户端都在一个系统下时使用的ip和端口

    58210

    Socket原理

    socket一词的起源 在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。 write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节 数。...其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

    54421

    温故Linux后端编程(五):SOCKET网络编程

    或UDP来传输,用IPV4的地址 AF_INET6:和上面的差不多,这个是IPV6的 AF_UNIX:本地协议,用在Unix和Linux系统上,一般都是服务端和客户端在同一台机器上时使用。...(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger)); ---- recv&send函数 socket函数创建一个文件描述符fd...运行过程 同步Socket的send函数的执行流程,当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度(因为待发送数据是要copy到套接字s的发送缓冲区的,注意并不是send...同步Socket的recv函数的执行流程:当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,(发送先) 如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回...在收发数据频繁时,由于tcp传输消息的无边界,会导致客户端/服务器端不知道接收到的消息到底是第几条消息,因此,会导致类似一次性接收几条消息的情况,从而乱码。

    83320

    通信原理一个月能学会吗_通信原理第六版

    socket一词的起源 在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。 write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节 数。...其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

    29180

    Socket通信原理

    socket一词的起源 在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。 write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节 数。...其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

    90210

    socket通讯原理及例程(一看就懂)

    socket一词的起源 在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。 write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节 数。...其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

    3K30

    【网络编程系列】二:socket通信原理及实践

    socket一词的起源 在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。...这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。...如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。 write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数。...其它的我就不一一介绍这几对I/O函数了,具体参见man文档或者baidu、Google,下面的例子中将使用到send/recv。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。

    1.6K60
    领券