accept()函数说明
来源:互联网 发布:通达信布林线boll源码 编辑:程序博客网 时间:2024/06/05 04:05
函数是这样定义的:
#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 来避免同一个端口更多的连接。
////////////////////////////////////////
accept是阻塞函数,当监听socket调用accept时,它先到自己的receive_buf中查看是否有连接数据包,若有,把数据拷贝出来,删掉收到的数据包,创建新的socket与客户发来的地址建立连接。
若没有数据,那就阻塞等待。
- accept()函数说明
- accept函数
- accept函数.
- accept 函数
- accept函数
- accept()函数
- accept()函数
- accept函数
- accept()函数
- accept函数
- accept函数
- accept 函数
- accept函数
- tcp accept函数
- accept函数详解
- 网络编程-accept函数
- accept函数详解
- socket的accept函数
- 写入出字符串到一个文件而不覆盖原文件的内容(追加)
- 50种方法巧妙优化你的SQL Server数据库
- 在vs2008下使用cygwin(1):前言
- “文件共享锁定数溢出” 原因及解决方法
- stat函数说明
- accept()函数说明
- 水晶报表打包
- JasperReport详细介绍(三)
- Flex 跨域访问解决方案
- javascript获取IE客户端IP及MAC的实现
- JasperReport报表设计总结(一)
- Linux 笔试题1(填空)
- delphi 动态数组和静态数组首地址的区别
- c# winForm窗体上的按钮结束回车确认