int server_socket_init(){
int server_sockfd;
struct sockaddr_in server_address;
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);//建立服务器端socket
if(server_sockfd < 0 )
return -1;
bzero(&server_address,sizeof(server_address));
server_address.sin_family = AF_INET;
//server_address.sin_addr.s_addr = htonl(INADDR_ANY); //本机
server_address.sin_addr.s_addr = inet_addr(SERVER_IP);
server_address.sin_port = htons(SERVER_PORT);
if(bind(server_sockfd, (struct sockaddr *)&server_address,sizeof(server_address)) < 0 )
{
close(server_sockfd);
return -1;
}
if(listen(server_sockfd, 5) < 0)
{
close(server_sockfd);
return -1;
}
return server_sockfd;
}
int server_Listening(int server_sockfd)
{
struct sockaddr_in client_address;
int client_sockfd, ret = 0;
int select_result,fd,client_len,data_size;
struct timeval timeout;
fd_set readfds, testfds;
FD_ZERO(&readfds);
FD_SET(server_sockfd, &readfds);
while(1)
{
//每一轮监听后结构体被清0,每监听完一轮就要对结构体重新赋值,指定监听对象
testfds = readfds;
timeout.tv_sec = 2;
timeout.tv_usec = 500000;
select_result = select(FD_SETSIZE, &testfds,NULL,NULL,NULL);
if (select_result < 0)
{
return -1;
}
//perr_exit("select error");
for(fd = 0; fd < FD_SETSIZE; fd++) /*扫描所有的socket(文件)描述符*/
{
if(FD_ISSET(fd,&testfds))/*找到可以读写相关socket(文件)描述符*/
{
if(fd == server_sockfd) //为服务器socket,是则表示为客户请求连接。
{
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
if(client_sockfd < 0)
return -1;
FD_SET(client_sockfd, &readfds);//将客户端socket加入到集合中
}
else //客户端socket中有数据请求时
{
ioctl(fd, FIONREAD, &data_size);//nread得到fd缓冲区的大小,就是当client写入缓冲区,这操作是读取缓冲区的大小
// n=read(fd,buf,sizeof(buf));//n即和nread一致
/*客户数据请求完毕,关闭套接字,从集合中清除相应描述符 */
if(data_size == 0)
{
//test
FASTCGI_LOG("\n client_close_remore :%d\n\n\n\n",fd);
close(fd);
FD_CLR(fd, &readfds);
}
else if(!PerformServerTransfer(fd)){
return -1;
}
}
}
}
}
}这个是tcp server端有误么