大家好,又见面了,我是你们的朋友全栈君。...1.socke分类 2.基本操作函数 3.c实现的网络聊天程序 套接字(socket) *是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。...1.3原始套接字 该套接字允许对较低层协议(如IP或ICMP)进行直接访问。 2....参数protocol说明该套接字使用的协议族中的特定协议。如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。...accept():接受连接请求 服务器进程使用系统调用socket,bind和listen创建一个套接字,将它绑定到知名的端口,并指定连接请求的队列长度。
摘要 在linux下,使用socketpair函数能够创建一对套节字进行进程间通信(IPC)。...SOCK_STREAM是基于TCP的,而SOCK_DGRAM是基于UDP的 参数3(protocol):表示类型,只能为0 参数4(sv[2]):套节字柄对,该两个句柄作用相同,均能进行读写双向操作...EOPNOTSUPP:指定的协议不支持创建套接字对。 EPROTONOSUPPORT:本机不支持指定的协议。 注意: 1、该函数只能用于UNIX域(LINUX)下。...2、只能用于有亲缘关系的进程(或线程)间通信。 3、所创建的套节字对作用是一样的,均能够可读可写(而管道PIPE只能进行单向读或写)。...// read(sv[0], &val, sizeof(val)); //如果字进程不写数据,将会导致此处堵塞 //printf("%d receive message: %d\n"
C语言中有俩种文件类型,即文本文件和二进制数据文件 文本文件 文本文件又称AscII文件,其中每个字节存放一个ASCII码。文本文件的输出和字符一一对应 每行由零个或多个字符组成,并以'\n'结束。.../写等操作 文件的打开和关闭 C语言在进行文件操作时,必须遵守打开--读写--关闭的流程,不打开就不能读写文件,也必须在使用完成之后关闭文件 C语言提供函数fopen用来打开文件 文件指针名=fopen...printf("salary\n"); scanf("%d", &worker[i].salary); printf("address\n"); scanf("%d"...; } 文件的其他读写函数 putw(w,fp)把字型数据写入文件中 w是四字节数据,可以说变量或者常量 getw从fp指向的文件中读取一个整型数据 getw(fp); 如果putw和getw调用成功,...返回要输入输出的数据,调用失败返回EOF 这个例子我就不写了,写入写出都是四字节。
二、开始敲服务端代码 2.1 搞清楚使用 socket 进行通信的步骤 编写C语言Windows下的socket需要经过几个步骤:首先对WSAStartup 进行初始化,初始化对socket 套接字(socket...也叫套接字)进行创建,随后配合绑定信息,接着进行配置信息的bind 绑定;绑定了信息后,通过该信息进行isten 监听,监听后若有链接则connect 连接,再接下来开始使用accept 接收请求,得到请求后可以选择接受...这是进行 socket 编程的步骤,如果你要问为什么要这样做…我只能回答你规定的流程就这样,因为你要进行通信,那肯定需要创建一个 socket ,创建完毕后那么肯定要绑定你要通信的信息,如果你不绑定你怎么知道你要跟谁说话呢...不不不,我们写法有一些不同,需要用一个函数 MAKEWORD 对版本进行生成,就像这样 WSAStartup(MAKEWORD(2, 2), &wsadata);,规定咱们使用 MAKEWORD 告诉...cIntSock 就是刚刚从套接字里接受的那个接待员,现在就用接待员和他说话了。 接着就使用printf显示接待员听到的话,简简单单。 然后就到我们输入信息,使用scanf够简单了吧?
每个线程初始化后会执行work函数,work函数是一个while死循环,里面的getReadyIOFd会阻塞线程,直到有可读可写的套接字时,才会唤醒线程,去进行连接的读写。...IO多路复用的实现模型大家多少听过一些,我们先比较下常见的select和epoll select select简单理解就是拿一个数组保存连接套接字,调用select时,会将整个数组拷贝到内核空间中,如果当前数组中没有可读写的套接字...等到数组中有可读写的套接字,或者超时(select可以设置阻塞的超时时间),select调用会返回,然后线程遍历全部数组,找到可读写的套接字,进行读写处理。...新获取到一个套接字后,将该套接字添加到wq中,等到套接字可读写时,操作系统会将该套接字从wq转到rdlist,然后线程直接处理rdlist中的套接字即可,不需要再遍历全部监听的套接字了。...参考文章 如果这篇文章说不清epoll的本质,那就过来掐死我吧! 写在最后 如果本文对你有用,点个赞再走吧!或者关注我,我会带来更多优质的内容。 [1621731683200-image.png]
先说说我的理解:socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组,eg. s[2] .这对套接字可以进行双工通信,每一个描述符既可以读也可以写。...有一定的区别,pipe是单工通信,一端要么是读端要么是写端,而socketpair实现了双工套接字,也就没有所谓的读端和写端的区分 验证代码: #include #include...我想不明白,为什么这时候父进程不能读取数据呢。 而上一种情况,父进程先读取数据,子进程仍然可以读取数据(数据为空),但子进程不会阻塞在read上。...,可以想象,两个描述符互为读写缓冲区,即解决了这个问题).然后应用相应socket家族里的read/write函数执行读写操作....有了这个基础,即可明白为什么试用fork产生的两个子进程都不关闭读端的时候会竞争,如上所述,他们共享相同的文件表项,有相同的inode和偏移量,两个进程的操作当然是相互影响的.
#define是宏定义,在编译预处理时,会对宏名进行宏代换/宏展开,就是替换掉 scanf("%s", bufSend); 1.scanf() 读取到空格时认为一个字符串输入结束 2.可以使用gets(...inet.h> #include #include #define BUF_SIZE 100 int main(){ //创建套接字...int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //将套接字和IP、端口绑定 struct..., buffer); //关闭套接字 close(sock); return 0; } 效果: ?...("服务器返回: %s\n", buffer); //关闭套接字 close(sock);} 效果: ?
搭建服务器和客户端编程 - IP地址转换实战演示 - 1、首先我们来演示inet_addr这个函数来对ip地址转换: #include #include <sys/socket.h...- 搭建服务器 - 第一步:调用socket函数来创建套接字。 第二步:调用bind函数分配IP地址和端口号。 第三步:调用listen函数转为可接收状态。...返回值是一个fd,accept正确返回就表示我们已经和前来连接我的客户端之间建立了一个TCP连接了,以后我们就要通过这个连接来和客户端进行读写操作,读写操作就需要一个fd,这个fd就由accept来返回了...第五步:关闭套接字文件描述符。 注意:socket返回的fd叫做监听fd,是用来监听客户端的,不能用来和任何客户端进行读写;accept返回的fd叫做连接fd,用来和连接那端的客户端程序进行读写。...- 客户端 - socket,先创建套接字。 connect,用来连接服务器的。
我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍。...根据美国计算机历史博物馆的记载,Croker写道:“命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。”...这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。 正如可以给fopen的传入不同参数值,以打开不同的文件。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。...这导致它的TCP也发送一个FIN N; 接收到这个FIN的源发送端TCP对它进行确认。 这样每个方向上都有一个FIN和ACK。
在许多操作系统中,套接字描述符和其他I/O描述符是集成在一起的,所以应用程序可以对文件进行套接字I/O或I/O读/写操作。...内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。 自然要问的是:为什么要有两种套接字?...4.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。...此时和accept接口没有关系,即使没有accepte,也进行3次握手完成。 连接出现连接不上的问题,一般是网路出现问题或者网卡超负荷或者是连接数已经满啦。...这导致它的TCP也发送一个FIN N; 接收到这个FIN的源发送端TCP对它进行确认。 这样每个方向上都有一个FIN和ACK。 1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
Socket就是该模式的一个实现, socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。...这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。...连接套接字:一个套接字会从主动连接的套接字变身为一个监听套接字;而accept函数返回的是已连接socket描述字(一个连接套接字),它代表着一个网络已经存在的点点连接。...内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。 为什么要有两种套接字?...close 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。
大家好,又见面了,我是你们的朋友全栈君。 Unix套接字好像是套接字和管道的混合,socketpair()可以创建一对无命名的、相互连接的Unix域套接字。...如果函数成功,则返回0,创建好的套接字分别是sv[0]和sv[1];否则返回-1,错误码保存于errno中。 基本用法: 1. 这对套接字可以用于全双工通信,每一个套接字既可以读也可以写。...如果往一个套接字(如sockfd[0])中写入后,再从该套接字读时会阻塞,只能在另一个套接字中(sockfd[1])上读成功; 3....socket.h> int main(int argc,char *argv[]) { int ret; /* 返回值 */ int sock[2]; /* 套接字对...is a test”; struct msghdr msgr; struct iovec iovr[1]; char recv_buf[100]; /* 创建套接字对
(Unix Domain Socket) 使用 TCP 和 UDP 进行 socket 通信是一种广为人知的 socket 使用方式,除了这种方式还有一种称为 Unix 域套接字的方式,可以实现同一主机上的进程间通信...Docker 守护进程(Docker daemon)使用了 Unix 域套接字,容器中的进程可以通过它与Docker 守护进程进行通信。MySQL 同样提供了域套接字进行访问的方式。...文件的拥有者和权限决定了谁可以读写这个套接字。 与普通套接字的区别是什么?...Unix 域套接字更加高效,Unix 套接字不用进行协议处理,不需要计算序列号,也不需要发送确认报文,只需要复制数据即可 Unix 域套接字是可靠的,不会丢失报文,普通套接字是为不可靠通信设计的 Unix...前面信号部分我们介绍过,JVM 对 SIGQUIT 的默认行为是 dump 当前的线程堆栈,那为什么调用 VirtualMachine.attach 没有输出调用栈堆栈呢?
,这里返回一个新的套接字,后面通信时,就用这个m_connfd进行通信 struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr...这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。 正如可以给fopen的传入不同参数值,以打开不同的文件。...//定义客户端的套接字,这里返回一个新的套接字,后面通信时,就用这个m_connfd进行通信 struct sockaddr_in client_addr; socklen_t client_len...内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。
perror(m); \ exit(EXIT_FAILURE); \ } while (0) int main() { //创建套接字...,这里返回一个新的套接字,后面通信时,就用这个m_connfd进行通信 struct sockaddr_in client_addr; socklen_t client_len = sizeof...perror(m); \ exit(EXIT_FAILURE); \ } while (0) int main() { //创建套接字...也就是说 当客户端断开,服务端不停的接收到一个0字节 这个非常奇怪,客户端已经断开了,为什么服务端还会收到一个0字节的数据呢?...这个问题我找了很久依旧没有找到一个合理的答案,网上的解释不是很明白,有懂的同学可以在评论区帮忙解释下。
它不需要走传统网络协议栈,也就不需要计算校验和、维护序列号以及应答等操作。 Unix域提供两种套接字:字节流套接字(类似TCP)以及数据报套接字(类似UDP)。...,有关联打开的描述符,但是connect的套接字类型和路径名关联的套接字类型不一致 如果connect调用发现这个舰艇套接字的队列已满,那么调用就会立即返回一个ECONNREFUSED错误(不同于TCP...但实际应用中,经常需要同时进行读写。...不过Linux中全双工socketpair函数可实现对两个描述符中的任何一个同时进行读写。...该函数创建的两个套接字都是无名socket,在Linux中,完全可以把这一对socket当成pipe返回的描述符一样使用。 使用方式: sockfd0和sockfd1每个套接字都可用于读写。
就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。 2、什么是Socket?...我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍。...根据美国计算机历史博物馆的记载,Croker写道:“命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。”...这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。 正如可以给fopen的传入不同参数值,以打开不同的文件。...3.6、close()函数 在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字,好比操作完打开的文件要调用fclose关闭打开的文件。
需要注意的是,inet_pton/inet_ntop对IPV4和IPV6地址都适用。...它和文件描述类似,只不过此时它还不能进行正常的网络读写。...bind--指定套接字地址信息 调用socket函数之后已经确定了协议族和传输协议,但是还没有确定本地协议,即套接字地址信息。...但是在客户端其ip地址和端口并非需要确切知道,因此客户端常常不绑定端口。在我们的echo程序中,我们也没有在客户端调用bind函数。...为什么客户端连接到服务端后,服务端有一个处于LISTEN状态,还有一个处于ESTABLISHED状态吗? 通过已连接套接字描述符就可以对其进行数据的读写了。
TCP 是基于连接的数据流的协议,先建立连接再进行通信,而且在通信过程中会检查数据是否发送成功。优点就是保证数据的完整性和准确性,缺点就是效率较低。 TCP的实现: 服务器 1....监听客户端的连接 int listen(int sockfd, int backlog); // 注:该函数不阻塞 5....tcpsock = socket(AF_INET, SOCK_STREAM, 0); if(tcpsock == -1) { perror("创建套接字失败!"...("服务器的代码中产生的旧套接字:%d\n", tcpsock); // printf("服务器的代码中产生的新套接字:%d\n", newsock); // 读取客户端发送过来的信息...与服务器进行通信 5.
缓冲区根据其对应的是输入设备输出设备,分为输入缓冲区和输出缓冲区。 ---- 2、为什么要存在缓冲区 我们为什么要引入缓冲区呢?...比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度...1、全缓冲 在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。 2、行缓冲 在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。...}; printf("请输入密码:>"); scanf("%s", password); printf("请确认密码(Y/N):>"); int ch = getchar(); if (ch == 'Y...有两种方法: 法一:在scanf后面加一个getchar(不推荐) #include int main() { char password[20] = { 0 }; printf
领取专属 10元无门槛券
手把手带您无忧上云