博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
accept()
阅读量:6495 次
发布时间:2019-06-24

本文共 3440 字,大约阅读时间需要 11 分钟。

在一个套接口接受一个连接。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:套接字描述符,该套接口在 后监听连接。
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:通过一个 来取消一个(阻塞的)调用。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEINVAL:在accept()前未激活listen()。
WSAEMFILE:调用accept()时队列为空,无可用的描述字。
WSAENOBUFS:无可用缓冲区空间。
WSAENOTSOCK:描述字不是一个套接口。
WSAEOPNOTSUPP:该套接口类型不支持面向连接服务。
WSAEWOULDBLOCK:该套接口为非阻塞方式且无连接可供接受。
WSAECONNRESET:接受连接后在accept返回之前,被远程客户端断开连接。
参见:

转载地址:http://wtcyo.baihongyu.com/

你可能感兴趣的文章
Vue国际化实现
查看>>
设计模式:单例模式
查看>>
FLASH位宽为8、16、32时,CPU与外设之间地址线的连接方法
查看>>
双网卡一般情况不能有两个网关 (转)
查看>>
xshell 远程连接Linux
查看>>
Linux计划任务及压缩归档(week2_day1)--技术流ken
查看>>
微信小程序登录 该死的官方文档TypeError: the JSON object must be str, not 'bytes'
查看>>
VMware 虚拟机克隆 CentOS 6.5 之后,网络配置问题的解决方案
查看>>
Python ( 1 ) ----- 简介
查看>>
[linux基础学习]run level
查看>>
第七周学习总结
查看>>
一步步的教你安装UChome (UChome 安装教程)
查看>>
[DeeplearningAI笔记]序列模型1.5-1.6不同类型的循环神经网络/语言模型与序列生成...
查看>>
P2533 [AHOI2012]信号塔
查看>>
Android电话拨号器(uri格式)与四种设置点击事件的方法
查看>>
java web中对json的使用
查看>>
TYVJ P1051 选课 Label:多叉转二叉&&树形dp(虐心♥)
查看>>
将数据库中提取出来的数据在后台进行分页处理
查看>>
bzoj1034
查看>>
百度地图 鼠标绘制,获取矩形,多边形的顶点经纬度
查看>>