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;
}

运行结果:

accept函数(TCP)相关推荐

  1. accept函数与TCP三次握手

    ❤️强烈推荐人工智能学习网站❤️ accept函数和TCP三次握手有没有关系?有什么关系?一段代码让你从此不在疑惑. 服务端: #include <unistd.h> #include & ...

  2. tcp/ip网络编程--accept()函数返回的套接字

    tcp/ip网络编程–accept()函数返回的套接字 套接字:1)套接字是对网络中不同主机的应用进程之间进行双向通信的端点的抽象:一个套接字就是网络进程通信的一端.[1] 2)套接字是用来与另一个进 ...

  3. TCP/IP编程之accept函数详解

    accept函数由TCP服务器调用,用于从已完成连接队列返回下一个已完成连接.如果已完成连接队列为空,那么进程被投入睡眠(假定套接字默为默认的阻塞方式) 函数原型: ACCEPT(2) Linux P ...

  4. TCP的listen和accept函数

    int listen(int sockfd, int backlog); 完成两件事情: 1.将未连接的套接口转换成被动套接口,指示内核应接收指向此套 接的 连接请求.       导致套接口从CLO ...

  5. tcp accept函数

    摘要:对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的.它从内核中取出已经建立的客户连接,然后把这个已经建立的连接返回给用户程序,此时用户 ...

  6. listen()与accept()函数的区别

    listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定 ...

  7. accept函数_基础套接字函数入门1

    想不想自己写一个简单的QQ?想不想自己写一个聊天室?想不想知道2000年的人是如何上网的?本节讲解一些基础的网络函数,带你看看,编写一个完整的TCP客户端.服务端需要掌握哪些函数?之后,我们要开发自己 ...

  8. C语言socket accept()函数(提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符)

    文章目录 名称 使用格式 功能参数描述 参数 sockfd addr addrlen 返回值 示例 man 2 文档中的accept解释 错误处理 名称 accept() 接收一个套接字中已建立的连接 ...

  9. socket的accept函数解析以及服务器和多个客户端的端口问题

     今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自 ...

最新文章

  1. c语言患者住院管理系统,患者住院管理系统 C,C++.doc
  2. 如何制作可以在 MaxCompute 上使用的 crcmod
  3. C#调用ATL COM
  4. 实例35:python
  5. Flume Sink
  6. 红外遥控(NEC协议)编程
  7. 计算机二级c简介,二级C语言
  8. Netty高级进阶之基于Netty的Websocket开发网页聊天室
  9. 计算机力学专业排名,专业+排行榜
  10. 短信接口抓包_[实战] 实现抢票小工具amp;短信通知提醒
  11. 计算机网络 --- 物理层知识点总结
  12. 数学式子对应的c语言表达式是,把数学式写成C语言表达式
  13. mini2440LED驱动程序开发
  14. IIC,SPI,UART,单总线
  15. depot_tools官方文档+工具包下载
  16. 新基建搭台,城市智能体唱戏 广西开启数字经济新篇章
  17. JavaScript——利用onblur事件实现文本框中英文字母全部转换成大写
  18. C#窗体——100以内加法做题程序
  19. 面向六部十层电梯群控算法的研究
  20. IntelliJ IDEA 2019 激活注册码(可用)截至到5月4号

热门文章

  1. Qemu kvm_qemu详细教程
  2. jsonp跨域原理及使用
  3. 1 网站压力测试工具 WEB性能测试 Web Bench
  4. Vue+Gojs实现流程图demo
  5. Vue解决跨域多个target问题(配置多个代理问题)
  6. KL Divergence 与 JS Divergence
  7. T 分布与高斯分布的差异
  8. 一份不太简短的LaTeX2e介绍最新版地址2019 The Not So Short In­tro­duc­tion To LATEX (Chi­nese Edi­tion)
  9. Https单向认证和双向认证 认识和区别
  10. iOS https证书双向认证的实现机制