accept函数(TCP)

article/2025/11/1 11:55:03

accept函数(TCP)

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

功能:阻塞等待客户端的连接请求

sockfd:文件描述符,socket函数的返回值(也就是listen函数中设置为监听状态的套接字)
addr:接收到的客户端的信息结构体(自动填充,定义变量即可)(包括客户端IP和端口信息等)
addrlen:addr的长度

返回值
成功:新的文件描述符(只要有客户端连接,就会产生新的文件描述符,这个新的文件描述符专门与指定的客户端进行通信的,原始套接字其实只是起到一个连接作用)
失败:‐1

在TCP服务器与客户端通信时,要使用accept返回值,不能再使用socket返回值,意味着在TCP中socket返回值只是起到一个连接作用,真正通信是accept返回值

代码示例:
服务器:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>#define N 128int main(int argc,char const *argv[])
{if(argc < 3){fprintf(stderr,"Usage: %s [ip] [port]\n",argv[0]);exit(1);}//第一步:创建套接字int sockfd;if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("fail to socket");exit(1);}//第二步:由于服务器要先执行且客户端要找到服务器,所以要将套接字与服务器网络信息结构体绑定struct sockaddr_in serveraddr;socklen_t addrlen = sizeof(serveraddr);serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv[1]);//先把字符串转换成整型数,再将主机字节序转换成网络字节序serveraddr.sin_port = htons(atoi(argv[2]));if(bind(sockfd,(struct sockaddr *)&serveraddr,addrlen) == -1){perror("fail to bind");exit(1);}//第三步:将套接字设置为被动监听状态if(listen(sockfd,10) == -1){perror("fail to listen");exit(1);}//第四步:阻塞等待客户端的链接请求int acceptfd;struct sockaddr_in clientaddr;if((acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen)) == -1){perror("fail to accept");exit(1);}//打印连接客户端的信息printf("ip: %s port: %d\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));//第五步:进行通信//tcp服务器与客户端通信时,需要使用accept函数的返回值char buf[N] = "";if(recv(acceptfd,buf,N,0) == -1){perror("fail to recv");}printf("from client: %s\n",buf);strcat(buf,"++");if(send(acceptfd,buf,N,0) == -1){perror("fail to send");exit(1);}//关闭套接字与文件描述符close(acceptfd);close(sockfd);return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>#define N 128//默认argv是一个指针数组,所以每一个成员都是一个字符串
int main(int argc,char const *argv[])
{if(argc < 3){fprintf(stderr,"Usage: %s [ip] [port]\n",argv[0]);exit(1);}//第一步:创建套接字int sockfd;if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("fail to socket");exit(1);}//第二步:发送客户端连接请求struct sockaddr_in serveraddr;socklen_t addrlen = sizeof(serveraddr);serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv[1]);//先将字符串转换成整型数据,再将主机字节序转换成16位网络字节序serveraddr.sin_port = htons(atoi(argv[2]));if(connect(sockfd,(struct sockaddr *)&serveraddr,addrlen) == -1){perror("fail to connect");exit(1);}//第三步:进行通信//发送数据char buf[N] = "";fgets(buf,N,stdin);buf[strlen(buf) - 1] = '\0';if(send(sockfd,buf,N,0) == -1){perror("fail to send");exit(1);}//接收数据char text[N] = "";if(recv(sockfd,text,N,0) == -1){perror("fail to recv");exit(1);}printf("from server:%s\n",text);//第四步:关闭套接字文件描述符close(sockfd);return 0;
}

运行结果:
客户端与服务器进行通信


http://chatgpt.dhexx.cn/article/iTWrgAbn.shtml

相关文章

Context context = getApplicationContext()

使用getApplicationContext 取得的是当前app所使用的application&#xff0c;这在AndroidManifest中唯一指定。意味着&#xff0c;在当前app的任意位置使用这个函数得到的是同一个Context 1、Context概念 其实一直想写一篇关于Context的文章&#xff0c;但是又怕技术不如而误人…

AutoCompleteTextView

自动完成的提供建议的文本 使用方法 //arrays.xml <?xml version"1.0" encoding"utf-8"?> <resources><array name"city_name"><item>Chengdu</item><item>Beijing</item><item>Tianjin<…

http状态码、accept、Content-Type

一、http状态码 &#xff08;1&#xff09;http状态码 1XX&#xff1a;信息&#xff0c;服务器收到请求&#xff0c;需要请求者继续执行操作 2XX&#xff1a;成功&#xff0c;操作被成功接收并处理 3XX&#xff1a;重定向&#xff0c;需要进一步的操作以完成请求 4XX&#xf…

Gated-Attention Readers for Text Comprehension

Gated-Attention Readers for Text Comprehension 文本理解中的门控attention阅读器 code Abstract 本文研究的是完形填空问题式MRC&#xff0c;作者提出的门控注意力阅读器集中了多跳结构和一种新的注意力计算机制&#xff08;基于query嵌入和RNN文档阅读器中间状态之间的…

Html中Input的accept属性

Accept属性规定通过在文件上传提交的服务接受的文件类型 但是accept属性只能适用在Html input类型为文件类型&#xff0c;也就是说其他类型的input accept属性就不适用 我写的这个过滤文件属性是针对于后缀名为.xls的文件&#xff0c;所有的文件只要不是.xls后缀就不显示出来…

ApplicationContext

如果说BeanFactory是Spring的心脏&#xff0c;那么Application就是完整的身躯。ApplicationContext就是由BeanFactory派生出来的。 1、ApplicationContext ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径…

ActionContext

1、ActionContext翻译成中文就是Action的上下文&#xff08;为什么说是上下文&#xff0c;是应为他的生命周期长&#xff0c;和我们的项目的生命周期是相同的&#xff0c;我们很多公共的东西都放在里面&#xff0c;方便存取 &#xff09;&#xff0c;ActionContext是struts2的上…

readonly option is set (add ! to override)错误的解决

在mac电脑或linux系统中经常操作修改某个文件后保存退出出现readonly option is set (add ! to override)。如图&#xff1a; 正常情况下按 A进入编辑模式修改文件后按ESC退出编辑模式&#xff0c;:wq命令保存退出&#xff0c;但经常会遇到以上显示&#xff0c;文件权限只读或者…

ByteBuffer的allocate和allocateDirect

在Java中当我们要对数据进行更底层的操作时&#xff0c;通常是操作数据的字节&#xff08;byte&#xff09;形式&#xff0c;这时常常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式&#xff1a; Java代码 public static ByteBuffer allocate(int capacity…

直接内存 直接内存的释放和回收

直接内存 特点 不属于Java虚拟机管理&#xff0c;属于系统内存&#xff1b;属于操作系统&#xff0c;常见于NIO操作时&#xff0c;比如ByteBuffer【】用于数据缓冲区分配回收成本较高&#xff0c;但读写性能高&#xff1b;不受JVM内存回收管理 文件读写过程 java不具备磁盘…

解决The‘Access-Control-Allow-Origin‘ header contains multiple values‘*, ....‘, but only one is allowed

报错内容&#xff1a; Access to XMLHttpRequest at ‘http://www.z…n.com/api/login’ from origin ‘http://z…n.com’ has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header contains multiple values ‘*, http://z…n.com’, but only one is …

C++中std::allocator的使用

标准库中包含一个名为allocator的类&#xff0c;允许我们将分配和初始化分离。使用allocator通常会提供更好的性能和更灵活的内存管理能力。 new有一些灵活性上的局限&#xff0c;其中一方面表现在它将内存分配和对象构造组合在了一起。类似的&#xff0c;delete将对象析构和内…

alloc的流程

1⃣️ 2⃣️ 3⃣️ 现在我们看的objc源码都是2.0的版本&#xff0c;之前还有一个1.0的版本 4⃣️ 5⃣️核心方法 最主要的就是最下面三个方法 他的最重要作用就是开辟内存 cls->instanceSize 先计算出需要的内存空间大小这个大小只和对象的成员变量有关 在没有成员变量…

ByteBuffer.allocate()与allocateDirect()的区别

allocate()产生的是HeapByteBuffer的实例, 本质上是一个no direct buffer, allocateDirect()产生的是DirectByteBuffer的实例, 本质是一个direct buffer 主要区别 buffer的创建方式不同, no direct buffer还可以通过封装已存在的byte array来产生执行IO操作时不同, no direct …

ByteBuffer常用方法与分析

目录 目标 常用API 工具方法 演示案例 allocate(int capacity)和allocateDirect(int capacity) put()和get() flip()和hasRemaining() clear() compact() wrap() 总结 目标 掌握ByteBuffer常用方法&#xff0c;分析ByteBuffer对象在切换读写模式的情况下基本属性的变…

allocate与allocateDirect的性能测试

allocate与allocateDirect的性能测试 测试工具JMH测试代码JMH结果结论 测试工具JMH java基准测试框架 测试代码 直接分配系统内存(allocateDirect) -测试申请内存性能JVM堆分配内存(allocate)-测试申请内存性能直接内存-操作-连续二十次添加(allocateDirect)-测试内存操作性能…

ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别

在Java中当我们要对数据进行更底层的操作时&#xff0c;一般是操作数据的字节&#xff08;byte&#xff09;形式&#xff0c;这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式&#xff1a; public static ByteBuffer allocate(int capacity) public s…

8、ByteBuffer(方法演示2(allocate堆内存和allocateDirect直接内存))

ByteBuffer&#xff08;方法演示2&#xff08;allocate堆内存和allocateDirect直接内存&#xff09;&#xff09; Allocate&#xff1a;java堆内存:读写效率低&#xff0c;收到gc的影响&#xff08;因为我们的java对象也是存在堆内存的&#xff09; &#xff01;&#xff01;…

03 Java NIO allocateDirect()和allocate()区别

03 Java NIO allocateDirect和allocate区别 allocateDirect()和allocate()区别直接与非直接缓冲区直接与非直接缓冲区 源码分析 allocateDirect()和allocate()区别 allocateDirect&#xff1a;分配直接缓冲区&#xff0c;将缓冲区简历在物理内存中&#xff0c;可以提交效率 all…

ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别。

在Java中当我们要对数据进行更底层的操作时&#xff0c;一般是操作数据的字节&#xff08;byte&#xff09;形式&#xff0c;这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式&#xff1a; public static ByteBuffer allocate(int capacity) public …