accept函数的用法
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/11 23:24:50
accept函数的用法
socket = accept(m_server.m_hSocket,(sockaddr*)&name,&NamelLen);
,&NamelLen具体指的是什么?请具体点 我是新手
socket = accept(m_server.m_hSocket,(sockaddr*)&name,&NamelLen);
,&NamelLen具体指的是什么?请具体点 我是新手
accept()函数
准备好了,系统调用 accept() 会有点古怪的地方的!你可以想象发生 这样的事情:有人从很远的地方通过一个你在侦听 (listen()) 的端口连接 (connect()) 到你的机器.它的连接将加入到等待接受 (accept()) 的队列 中.你调用 accept() 告诉它你有空闲的连接.它将返回一个新的套接字文 件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口,新的在准备发送 (send()) 和接收 ( recv()) 数据.这就是这个过程!
函数是这样定义的:
#include
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
#include
#include
#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 来避免同一个端口更多的连接.
准备好了,系统调用 accept() 会有点古怪的地方的!你可以想象发生 这样的事情:有人从很远的地方通过一个你在侦听 (listen()) 的端口连接 (connect()) 到你的机器.它的连接将加入到等待接受 (accept()) 的队列 中.你调用 accept() 告诉它你有空闲的连接.它将返回一个新的套接字文 件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口,新的在准备发送 (send()) 和接收 ( recv()) 数据.这就是这个过程!
函数是这样定义的:
#include
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
#include
#include
#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 来避免同一个端口更多的连接.