Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75003
  • 博文数量: 25
  • 博客积分: 692
  • 博客等级: 上士
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-29 15:42
文章分类
文章存档

2011年(25)

分类: LINUX

2011-03-04 20:11:51

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    /* 多少等待连接控制 */
void main(void)
{
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来避免同一个端口更多的连接。
阅读(845) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~