在一个套接口接受一个连接。accept()是c语言中网络编程的重要的函数,windows系统在#include<winsock.h> ,而linux系统在#include <sys/socket.h>中。
外文名
accept()
文件包含
#include <sys/socket.h>
原    型
SOCKET PASCAL accept
返回值
失败返回-1

表达式简介编辑

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数
sockfd:套接字描述符,该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。

例子(c++)编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#ifndef UNICODE
    #defineUNICODE
#endif
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
//NeedtolinkwithWs2_32.lib
#pragmacomment(lib,"Ws2_32.lib")
int wmain(void)
{
    //----------------------
    //InitializeWinsock.
    WSADATAwsaData ;
    intiResult=WSAStartup(MAKEWORD(2,2),&wsaData);
    if(iResult!=NO_ERROR)
    {
        wprintf(L "WSAStartupfailedwitherror:%ld\n",iResult);
        return 1 ;
    }
    //----------------------
    //CreateaSOCKETforlisteningfor
    //incomingconnectionrequests.
    SOCKETListenSocket ;
    ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(ListenSocket==INVALID_SOCKET)
    {
        wprintf(L "socketfailedwitherror:%ld\n",WSAGetLastError());
        WSACleanup();
        return 1 ;
    }
    //----------------------
    //Thesockaddr_instructurespecifiestheaddressfamily,
    //IPaddress,andportforthesocketthatisbeingbound.
    sockaddr_inservice ;
    service.sin_family=AF_INET ;
    service.sin_addr.s_addr=inet_addr("127.0.0.1");
    service.sin_port=htons(27015);
    if(bind(ListenSocket,
    (SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
    {
        wprintf(L"bindfailedwitherror:%ld\n",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    //----------------------
    //Listenforincomingconnectionrequests.
    //onthecreatedsocket
    if(listen(ListenSocket,1)==SOCKET_ERROR)
    {
        wprintf(L"listenfailedwitherror:%ld\n",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    //----------------------
    //CreateaSOCKETforacceptingincomingrequests.
    SOCKETAcceptSocket ;
    wprintf(L "Waitingforclienttoconnect...\n");
    //----------------------
    //Accepttheconnection.
    AcceptSocket=accept(ListenSocket,NULL,NULL);
    if(AcceptSocket==INVALID_SOCKET)
    {
        wprintf(L "acceptfailedwitherror:%ld\n",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    else 
    wprintf(L "Clientconnected.\n");
    //Nolongerneedserversocket
    closesocket(ListenSocket);
    WSACleanup();
    return 0 ;
}

注释编辑

本函数从s的等待连接队列中抽取第一个连接,创建一个与s同类的新的套接口并返回句柄。如果队列中无等待连接,且套接口为阻塞方式,则accept()阻塞调用进程直至新的连接出现。如果套接口为非阻塞方式且队列中无等待连接,则accept()返回一错误代码。已接受连接的套接口不能用于接受新的连接,原套接口仍保持开放。
addr参数为一个返回参数,其中填写的是为通讯层所知的连接实体地址。addr参数的实际格式由通讯时产生的地址族确定。addrlen参数也是一个返回参数,在调用时初始化为addr所指的地址空间;在调用结束时它包含了实际返回的地址的长度(用字节数表示)。该函数与SOCK_STREAM类型的面向连接的套接口一起使用。如果addr与addrlen中有一个为零NULL,将不返回所接受的套接口远程地址的任何信息。
返回值:
如果没有错误产生,则accept()返回一个描述所接受包的SOCKET类型的值。否则的话,返回INVALID_SOCKET错误,应用程序可通过调用WSAGetLastError()来获得特定的错误代码。
addrlen所指的整形数初始时包含addr所指地址空间的大小,在返回时它包含实际返回地址的字节长度。

错误代码编辑

WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
WSAEFAULT:addrlen参数太小(小于socket结构的大小)。
WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEINVAL:在accept()前未激活listen()。
WSAEMFILE:调用accept()时队列为空,无可用的描述字。
WSAENOBUFS:无可用缓冲区空间。
WSAENOTSOCK:描述字不是一个套接口。
WSAEOPNOTSUPP:该套接口类型不支持面向连接服务。
WSAEWOULDBLOCK:该套接口为非阻塞方式且无连接可供接受。
WSAECONNRESET:接受连接后在accept返回之前,被远程客户端断开连接。
参见:

accept()的更多相关文章

  1. How to accept Track changes in Microsoft Word 2010?

    "Track changes" is wonderful and remarkable tool of Microsoft Word 2010. The feature allow ...

  2. GJM : 中断被Socket.Accept阻塞的线程

    原帖地址:http://blog.csdn.net/kingfox/article/details/7233350 原文作者:狐帝 刚刚学习C#,在编写一个网络通讯的程序的时候,遇到了点麻烦.监听代码 ...

  3. Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()

    前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...

  4. <input type="file" id="camera" multiple="multiple" capture="camera" accept="image/*"> 上传图片,手机调用相册和摄像头

    <input type="file" id="camera" multiple="multiple" capture="ca ...

  5. 调试 zeromq 发现 accept 死循环

    起因:在群里一个同学说使用 zeromq 的时候出了点儿问题,问题描述如下“router连接十几万客户端后,然后把router杀死,重启,这时候zeromq的某个线程99%的cpu,卡死了,再也接受不 ...

  6. UNIX网络编程-非阻塞connect和非阻塞accept

    1.非阻塞connect 在看了很多资料之后,我自己的理解是:在socket发起一次连接的时候,这个过程需要一段时间来将三次握手的过程走完,如果在网络状况不好或者是其他的一些情况下,这个过程需要比较长 ...

  7. 高性能网络编程(一)----accept建立连接

    编写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点.希望应用代码完全不关 ...

  8. According to TLD or attribute directive in tag file, attribute test does not accept any expressions

    HTTP Status 500 - /WEB-INF/views/emp/list.jsp (line: 30, column: 4) According to TLD or attribute di ...

  9. input[file]标签的accept=”image/*”属性响应很慢的解决办法

    转自:http://blog.csdn.net/lx583274568/article/details/52983693 input[file]标签的accept属性可用于指定上传文件的 MIME类型 ...

  10. Socket accept failed

    启动tomcat显示如下错误: java.net.SocketException: select failed at java.net.PlainSocketImpl.socketAccept(Nat ...

随机推荐

  1. rabbitmq 相关方法

    //连接$conn_args = array( 'host'=>'127.0.0.1' , 'port'=> '5672', 'login'=>'guest' , 'password ...

  2. 如何在iOS地图上高效的显示大量数据

    2016-01-13 / 23:02:13 刚才在微信上看到这篇由cocoachina翻译小组成员翻译的文章,觉得还是挺值得参考的,因此转载至此,原文请移步:http://robots.thought ...

  3. 提高你的数据库编程效率:Microsoft CLR Via Sql Server

    你还在为数据库编程而抓狂吗?那些恶心的脚本拼接,低效的脚本调试的日子将会与我们越来越远啦.现在我们能用支持.NET的语言来开发数据库中的对象,如:存储过程,函数,触发器,集合函数已及复杂的类型.看到这 ...

  4. colpick-jQuery颜色选择器使用说明

      一.demo及下载网址:http://www.htmleaf.com/jQuery/Color-Picker/20141108417.html   二.使用效果   三.使用方法 1.引入js和c ...

  5. Linux_Shell_输出重定向

      创建两个文件:touch 1  touch2  命令 > 文件  以覆盖的方式输出正确信息到文件或设备ls > 1 命令 >> 文件 以追加的方式输出正确信息到文件或设备l ...

  6. hdu2888 二维RMQ

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. mysql-查询一天,一周,一月,一年,以及mysql的基本日期函数

    查询一天: select * from table where to_days(column_time) = to_days(now()); select * from table where dat ...

  8. html5的一些表单属性。

    <pre>input属性:placeholder:输入框的默认值,向用户显示描述性说明文字或者提示信息 autocomplete:值为on和off..on则代表当该字段填写并提交后再返回该 ...

  9. KVO内部实现原理

    KVO的原理: 只要给一个对象注册一个监听, 那么在运行时, 系统就会自动给该对象生成一个子类对象, (格式如:NSKVONotifying_className), 并且重写自动生成的子类对象的被监听 ...

  10. 【LintCode】删除链表中的元素

    问题分析: 声明当前指针和上一个指针即可. 问题求解: public class Solution { public ListNode removeElements(ListNode head, in ...