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

时间: 2024-10-06 03:40:08

accept函数的相关文章

Socket进程处理被中断的系统调用及Accept函数返回EINTR错误处理

我们用慢系统调用来描写叙述那些可能永远阻塞的系统调用(函数调用),如:accept.read等.永远阻塞的系统调用是指调用有可能永远无法返回.多数网络支持函数都属于这一类.比如,假设没有客户连接到server上,则server对accept的调用就没有返回保证.类似的.假设客户从未发送过一行要求server回射的文本.则server对read的调用将永不返回.其它慢系统调用的样例是对管道和终端设备的读写. 有一个例外,就是磁盘IO.他一般都返回调用者. 当一个进程阻塞与慢系统调用时捕获到一个信号

socket执行accept函数时没有进入阻塞状态,而是陷入了无限循环

接着前两天继续看<VC深入详解>的网络编程部分,这次我快速看了遍书上的函数以及套接字C-S模型,然后自己从0开始写了个简单的服务端,结果发现一直在输出 而明明我还没有写客户端程序,由于打印的代码只有一处,在如下的while循环里 while (true) { /* 5. 接收客户端发送的连接请求 */ SOCKET sockConnect = accept(sockServer, (SOCKADDR*)&addrClient, &len); /* 6. [发送/接收]数据 */

传说用户发来的请求是在JIoEndpoint的accept函数中接收的,是tomact与外界交互的分界点

传说用户发来的请求是在JIoEndpoint的accept函数中接收的, 这是tomact与外界交互的分界点,所以来研究一下, >>>>>>>>>>>>>>>JIoEndpoint>>>>>>>>>>>>>>>>>>> 从最顶层的interface开启: ==================JIoEndp

listen和accept函数

listen函数是用来设置监听连接的句柄和队列 当listen函数执行完成以后,服务端就已经可以接受客户端来的新连接了,新连接完成以后listen会把客户端的ip,port和连接句柄放在监听队列里面,等待accept函数来取,如果监听队列满了,listen会拒绝新来的连接. accept仅仅是从监听队列里面取出连接而已,甚至不会关注连接的状态(比如连接断开在取出来的时候已经断开了都不知道) 也就是说,在服务端这边,listen才是整个连接的关键函数,accept不是

accept()函数用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;ignore()函数则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递(看一下QWidget::mousePressEvent的实现,最为典型。如果希望忽略事件,只要调用父类的响应函数即可)

QEvent的accept()和ignore()一般不会用到,因为不如直接调用QWidget类的事件处理函数直接,而且作用是一样的,见下面的例子. 推荐直接调用QWidget的事件处理函数.而不是调用accept()和ignore(). 只有一种情况下,必须使用调用accept()和ignore(),那就是closeEvent(),在closeEvent()的事件处理函数中,必须调用accept()和ignore().即如果想窗口被关闭,那么必须显示调用event->accept():如果不想关

【Linux 网络编程】常用TCP/IP网络编程函数

(1)函数socket 1 /**************************************************************** 2 ** 功能:创建一个套接字用于通信 3 ** 参数:domain 指定通信协议族 4 ** type 指定socket类型,流式套接字 SOCK_STREAM 5 ** 数据报套接字 SOCKDGRAM 6 ** 原始套接字 SOCKRAW 7 ** protocol 协议类型 (习惯上填写0) 8 ** 返回值:成功返回非负整数,它

socket编程函数详解

socket() #include <sys/types.h> #include <socket.h> int socket(int domain,int type,int protocol) 返回值:成功返回一个文件描述符(注意,这个套接字不能用于和用户进行通信,只能用于listen和accept客户端的连接请求),失败返回-1 参数: domain AF_INET             IPv4 Internet protocols type SOCK_STREAM    

转: 由socket的accept说开去

from: http://ticktick.blog.51cto.com/823160/779866 今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自己虽然熟悉socket的编程套路,但是却并不是那么清楚socket的原理,今天就趁这个机会,把有关socket编程的几个疑问给搞清楚吧. 先给出一个典型的TCP/IP通信示意图. 问题一:socket结构

Socket编程时recv函数错误:Transport endpoint is not connected的解决

今天在做socket网络通信实验时,server端执行到recv函数处报错:Transport endpoint is not connected. 以下是server和client的源码: server.c 1 #include <stdio.h> 2 #include <arpa/inet.h> 3 #include <sys/socket.h> 4 #include <string.h> 5 #include <unistd.h> 6 #i