int ret =bind(server_socket,(conststruct sockaddr_in*)&addr,sizeof(addr));//返回0则证明成功 bind()将一本地地址与一套接口捆绑。if(0!=ret){//绑定失败printf("bind %s:%d failed","127.0.0.1\n",port);failed(&server_socket);return;}//绑定成功printf("bind %s:%d success","127.0.0.1\n",port);
监听开始
API/变量
功能说明
listen()
创建一个套接口并监听申请的连接,如无错误发生,listen()返回0。否则的话,返回-1
printf("开始监听端口:%d\n",port);
ret =listen(server_socket,128);//允许等待最大连接数为128//如无错误发生,listen()返回0。否则的话,返回-1if(ret !=0){printf("listening on port:%d failed\n",port);failed(&server_socket);return;}printf("listening on port:%d success\n",port);
fd_set server_fd_set;//句柄集合 fd_set由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件发生了可读或可写事件。while(1){//select模型,处理socket事件FD_ZERO(&server_fd_set);//初始化句柄集合FD_SET(server_socket,&server_fd_set);// 添加socket到句柄集合printf("waiting the client in....\n");
ret =select(0,&server_fd_set,NULL,NULL,NULL);//传0代表把集合中所有的句柄,参数1、监听句柄数目 参数2、监听可读的句柄集合if(ret <0){//句柄无效printf("select error\n");}elseif(ret ==0){//超时,返回错误continue;}else{printf("waiting for data\n");}//监听端口接入信息if(FD_ISSET(server_socket,&server_fd_set)){//监听端口有可读数据//将端口监听信息打印出来struct sockaddr_in c_addr;//客户端的地址信息int len =sizeof(c_addr);int client_socket =accept(server_socket,(struct sockaddr*)&c_addr,&len);//创建客户端的socketif(client_socket != INVALID_SOCKET){//判断socket是否有效printf("new client %s:%d come in ",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port));//inet_ntoa()把地址转换成字符串类型,ntohs()将一个16位数由网络字节顺序转换为主机字节顺序}}