accept函数的用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了accept函数的用法相关的知识,希望对你有一定的参考价值。

参考技术A accept()函数是这样定义的:
#include
<sys/socket.h>
int
accept(int
sockfd,
void
*addr,
int
*addrlen);
sockfd
相当简单,是和
listen()
中一样的套接字描述符。addr
是个指
向局部的数据结构
sockaddr_in
的指针。这是要求接入的信息所要去的地
方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给
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
来避免同一个端口更多的连接。
参考技术B accept()函数
准备好了,系统调用
accept()
会有点古怪的地方的!你可以想象发生
这样的事情:有人从很远的地方通过一个你在侦听
(listen())
的端口连接
(connect())
到你的机器。它的连接将加入到等待接受
(accept())
的队列
中。你调用
accept()
告诉它你有空闲的连接。它将返回一个新的套接字文
件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口,
新的在准备发送
(send())
和接收
(
recv())
数据。这就是这个过程!
函数是这样定义的:
#include
<sys/socket.h>
int
accept(int
sockfd,
void
*addr,
int
*addrlen);
sockfd
相当简单,是和
listen()
中一样的套接字描述符。addr
是个指
向局部的数据结构
sockaddr_in
的指针。这是要求接入的信息所要去的地
方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给
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
来避免同一个端口更多的连接。

python requests包用法

1 先创建session , 设置header. 调用get()函数

s = requests.session()
headers = {
‘Accept‘:‘image/webp,image/*;q=0.8‘,
‘User-Agent‘:‘News/6.9.8.36 CFNetwork/975.0.3 Darwin/18.2.0‘,
‘Accept-Language‘:‘zh-cn‘
}
s.headers.update(headers)

s.get(url=url,params=params,verify=False)

 

2 直接调用get

requests.get(url, headers=headers, proxies=proxies).text

以上是关于accept函数的用法的主要内容,如果未能解决你的问题,请参考以下文章

谁能告诉我accept()函数返回一个新的套接字,所谓新套接字怎么理解?

Qt——信号与槽用法总结(未完待续)

accept函数

accept() 函数是如何工作的?

python requests包用法

mfc 关于Accept函数