百度知道规矩:Linux socket编程之套接字|,数据,阻塞,睡眠,操作,阻塞套接字,非阻塞

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 00:34:38

每一个TCP套接口有一个发送缓冲区,可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小。当应用进程调用write时,内核从应用进程的缓冲区 中拷贝所有数据到套接口的发送缓冲区。如果套接口的发送缓冲区容不下应用程序的所有数据(或是应用进程的缓冲区大于套接口发送缓冲区,或是套接口发送缓冲 区还有其他数据),应用进程将被挂起(睡眠)。这里假设套接口是阻塞的,这是通常的缺省设置。内核将不从write系统调用返回,直到应用进程缓冲区中的 所有数据都拷贝到套接口发送缓冲区。因此从写一个TCP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程的缓冲区。它并不告诉我们对端的 TCP或应用进程已经接收了数据。
    TCP取套接口发送缓冲区的数据并把它发送给对端TCP,其过程基于TCP数据传输的所有规则。对端TCP必须确认收到的数据,只有收到对端的ACK,本端TCP才能删除套接口发送缓冲区中已经确认的数据。TCP必须保留数据拷贝直到对端确认为止。

1 输入操作: read、readv、recv、recvfrom、recvmsg

    如果某个进程对一个阻塞的TCP套接口调用这些输入函数之一,而且该套接口的接收缓冲区中没有数据可读,该进程将被投入睡眠,直到到达一些数据。既然 TCP是字节流协议,该进程的唤醒就是只要到达一些数据:这些数据既可能是单个字节,也可以是一个完整的TCP分节中的数据。如果想等到某个固定数目的数 据可读为止,可以调用readn函数,或者指定MSG_WAITALL标志。

    既然UDP是数据报协议,如果一个阻塞的UDP套接口的接收缓冲区为空,对它调用输入函数的进程将被投入睡眠,直到到达一个UDP数据报。

    对于非阻塞的套接口,如果输入操作不能被满足(对于TCP套接口即至少有一个字节的数据可读,对于UDP套接口即有一个完整的数据报可读),相应调用将立即返回一个EWOULDBLOCK错误。

2 输出操作:write、writev、send、sendto、sendmsg

    对于一个TCP套接口,内核将从应用进程的缓冲区到该套接口的发送缓冲区拷贝数据。对于阻塞的套接口,如果其发送缓冲区中没有空间,进程将被投入睡眠,直到有空间为止。

    对于一个非阻塞的TCP套接口,如果其发送缓冲区中根本没有空间,输出函数调用将立即返回一个EWOULDBLOCK错误。如果其发送缓冲区中有一些空间,返回值将是内核能够拷贝到该缓冲区中的字节数。这个字节数也称为不足计数(short count)

    UDP套接口不才能在真正的发送缓冲区。内核只是拷贝应用进程数据并把它沿协议栈向下传送,渐次冠以UDP头部和IP头部。因此对一个阻塞的UDP套接口,输出函数调用将不会因为与TCP套接口一样的原因而阻塞,不过有可能会因其他的原因而阻塞

关于使用socket套接字的问题 求助----“windos socket error: 由于套接字没有连接并用。。。。” 熟悉套接字编程的进! 在编程中套接字是什么意思 Socket编程 windows socket error:套接字操作尝试连接一个无法连接的主机 求助,如何用用Socket套接字编写一个有界面的通信程序 Windows socket error:套接字操作尝试一个无法连接的主机。(10065),on API'connect' windows socket error:由于系统缓冲空间不足或列队已满,不能执行套接字上的操作。 windows socket error 以一种访问权限不允许的方式作了一个访问套接字的尝试? 开机后弹出windows socket error:由于由于套接字没有连接......(10057),on API'connect') 什么是SOCKET编程方法? socket通信编程 SOCKET编程资料 socket 编程资料 windows socket error 10057是怎么回事?什么由于套接没有连接 通过套接字编程,客户端程序能够从服务端程序获取服务端的时间 套接字是什么? 套接字未连接 linux下面如何编译socket Windows socket error:由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作.(10055),On API connect Windows socket error: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048), on API 'bind' Windows socket error: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048), on API 'bind' windows socket error:由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。(10055),on