zoukankan      html  css  js  c++  java
  • accept函数

    accept()函数 

           系统调用 accept() 会有点古怪的地方的!

           你能够想象发生 这种事情:有人从非常远的地方通过一个你在侦听 (listen()) 的port连接 (connect()) 到你的机器。它的连接将添�到等待接受 (accept()) 的队列 中。

           你调用 accept() 告诉它你有空暇的连接。它将返回一个新的套接字文 件描写叙述符!这样你就有两个套接字了,原来的一个还在侦听你的那个port, 新的在准备发送 (send()) 和接收 ( recv()) 数据。这就是这个过程! 

           函数是这样定义的: 

     #include <sys/socket.h>
     int accept(int sockfd, void *addr, int *addrlen); 

           sockfd 相当简单,是和 listen() 中一样的套接字描写叙述符。

           addr 是个指向局部的数据结构 sockaddr_in 的指针。这是要求接入的信息所要去的地 方(你能够測定那个地址在那个port呼叫你)。

           在它的地址传递给 accept 之 前,addrlen 是个局部的整形变量,设置为 sizeof(struct sockaddr_in)。  accept 将不会将多余的字节给 addr。假设你放入的少些,那么它会通过改变 addrlen 的值反映出来。 

           在错误时返回-1,并设置全局错误变量 errno。

            如今是你应该熟悉的代码片段。 

    #include <string.h> 
    #include <sys/socket.h> 
    #include <sys/types.h> 
    #define MYPORT 3490 /*用户接入端口*/ 
    #define BACKLOG 10 /* 多少等待连接控制*/ 
    main() 
    {
    	int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */
    	 struct sockaddr_in my_addr; /* 地址信息 */ 
    	struct sockaddr_in their_addr; /* connector's address information */ 
    	int sin_size; 
    	sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 错误检查*/
    	my_addr.sin_family = AF_INET; /* host byte order */
    	my_addr.sin_port = htons(MYPORT); /* short, network byte order */
    	my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ 
    	bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */
    	/* don't forget your error checking for these calls: */ 
    	bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); 
    	listen(sockfd, BACKLOG); 
    	sin_size = sizeof(struct sockaddr_in); 
    	new_fd = accept(sockfd, &their_addr, &sin_size); 

            注意,在系统调用 send() 和 recv() 中你应该使用新的套接字描写叙述符 new_fd。假设你仅仅想让一个连接进来,那么你能够使用 close() 去关闭原 来的文件描写叙述符 sockfd 来避免同一个port很多其它的连接。

            当你第一次调用 socket() 建立套接口描写叙述符的时候,内核就将他设置为堵塞。假设你不想套接口堵塞,你就要调用函数 fcntl():

            通过设置套接口为非堵塞,你可以有效地"询问"套接口以获得信息,可是一般来说轮询不是一个好主意,会浪费cpu时间,

            更好的方法是用 select()方法 去查询是否有数据要读进来

            select()--多路同步 I/O

            select() 让你能够同一时候监视多个套接口。假设你想知道的话,那么他就会告诉你哪个套接口准备读,哪个又准备好了写,哪个套接口又发生了例外 (exception)。

            int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);


  • 相关阅读:
    UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)
    Codeforces 482E ELCA (LCT)
    Codeforces 798D Mike and distribution (构造)
    AtCoder AGC017C Snuke and Spells
    HDU 6089 Rikka with Terrorist (线段树)
    HDU 6136 Death Podracing (堆)
    AtCoder AGC032D Rotation Sort (DP)
    jenkins+python+kubectl实现批量更新k8s镜像
    Linux 下载最新kubectl版本的命令:
    jenkins X 和k8s CI/CD
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3802814.html
Copyright © 2011-2022 走看看