继续上一篇,写startup方法,服务端socket的启动过程
int startup(u_short *port)
{
int httpd = 0;
//-------------- server_sock的fd声明
int on = 1;
struct sockaddr_in name;
//------------- 服务器地址的数据结构IP:PORT
httpd = socket(PF_INET, SOCK_STREAM, 0);
//------------- 创建一个socket,IPV4,TCP协议,返回server_socket的fd
if (httpd == -1)
error_die("socket");
memset(&name, 0, sizeof(name));
//--------- 初始化name的内存
name.sin_family = AF_INET;
//---------- IVP4
name.sin_port = htons(*port);
//---------- 端口
name.sin_addr.s_addr = htonl(INADDR_ANY);
if ((setsockopt(httpd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0)
//---------- 允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的
//-------- 多个网卡,多个IP时,该项目很重要
{
error_die("setsockopt failed");
}
if (bind(httpd, (struct sockaddr *)&name, sizeof(name)) < 0)
//--- 绑定到指定端口
error_die("bind");
if (*port == 0) /* if dynamically allocating a port */
{
socklen_t namelen = sizeof(name);
if (getsockname(httpd, (struct sockaddr *)&name, &namelen) == -1)
error_die("getsockname");
*port = ntohs(name.sin_port);
}
if (listen(httpd, 5) < 0)
//---------开始监听
error_die("listen");
return(httpd);
}