开发者社区> 问答> 正文

SLB的健康检查是不是应该有一个标准协议?

我用的是4层(TCP协议)服务,使用过程中发现SLB会定期往我的服务端口发起链接,以便做健康检查。


也就是这个链接导致了我的服务器报错,报错原因是SLB连上我的服务端口后迅速断开,导致SOCKET读取失败。


报错截图



服务器端测试代码:
/*
* server.c
*
*  Created on: 2010-6-30
*      Author: ankerdiao
*/  
  
#include <stdio.h>  
#include <stdlib.h>  
#include <errno.h>  
#include <string.h>  
#include <sys/types.h>  
#include <netinet/in.h>  
#include <sys/socket.h>  
#include <sys/wait.h>  
  
#define SERVPORT 3001  
#define BACKLOG 10  
#define MAXSIZE 1024  
  
void server() {  
    int sockfd, client_fd;  
    struct sockaddr_in my_addr;  
    struct sockaddr_in remote_addr;  
    //创建套接字  
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {  
        perror("socket create failed!");  
        exit(1);  
    }  
  
    //绑定端口地址  
    my_addr.sin_family = AF_INET;  
    my_addr.sin_port = htons(SERVPORT);  
    my_addr.sin_addr.s_addr = INADDR_ANY;  
    bzero(&(my_addr.sin_zero), 8);  
    if (bind(sockfd, (struct sockaddr*) &my_addr, sizeof(struct sockaddr))  
            == -1) {  
        perror("bind error!");  
        exit(1);  
    }  
  
    //监听端口  
    if (listen(sockfd, BACKLOG) == -1) {  
        perror("listen error");  
        exit(1);  
    }  
  
    while (1) {  
        int sin_size = sizeof(struct sockaddr_in);  
        if ((client_fd = accept(sockfd, (struct sockaddr*) &remote_addr,  
                &sin_size)) == -1) {  
            perror("accept error!");  
            continue;  
        }  
  
        //子进程段  
        if (!fork()) {  
            //接受client发送的请示信息  
            int rval;  
            char buf[MAXSIZE];  
            if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {  
                perror("reading stream error!");  
                continue;  
            }  
            printf("%s\n", buf);  
  
            //向client发送信息  
            char* msg = "Hello,Mr hqlong, you are connected!\n";  
            if (send(client_fd, msg, strlen(msg), 0) == -1)  
                perror("send error!");  
            close(client_fd);  
            exit(0);  
        }  
        close(client_fd);  
    }  
}  
  
int main() {  
    server();  
    return 0;  
}

即 62 行报错了。

展开
收起
ctidea.com 2014-11-04 15:50:27 9197 0
2 条回答
写回答
取消 提交回答
  • ReSLB的健康检查是不是应该有一个标准协议?
    打酱油~
    2014-11-04 16:55:08
    赞同 展开评论 打赏
  • ReSLB的健康检查是不是应该有一个标准协议?
    继续

    咱们是不是可以设计一个标准的健康检查协议,服务器端设计的时候遵循这个协议即可
    2014-11-04 15:51:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
《应用型负载均衡ALB产品解读》 立即下载
阿里云网络-SLB负载均衡产品介绍 立即下载
负载均衡SLB热点问题解答 立即下载