首页 > 解决方案 > 如何将 TCP 客户端-服务器应用程序转换为 SCTP 应用程序?

问题描述

我有一个使用 TCP 连接的 C 编程语言的客户端-服务器应用程序。只考虑服务器端。

主要功能如下:

int main(int argc, char* argv[])
{
    struct addrinfo *ailist, *aip, hint;
    int sockfd, err, n;

    memset(&hint, 0, sizeof(hint)); //set to 0 all bytes

    hint.ai_flags |= AI_PASSIVE;
    hint.ai_socktype = SOCK_STREAM;
    hint.ai_addr = NULL;
    hint.ai_next = NULL;
    
    if((err = getaddrinfo(NULL, "60185", &hint, &ailist))!=0)
    {
        printf("Error getaddrinfo %d\n", gai_strerror(err));
        syslog(LOG_ERR, "ruptimed: getaddrinfo error %s", gai_strerror(err));
        exit(1);
    }
    for (aip = ailist; aip!=NULL; aip = aip->ai_next)
    {
        if ((sockfd = initserver(SOCK_STREAM, aip->ai_addr, aip->ai_addrlen, QLEN))>=0)
        {
            serveImg(sockfd);
            printf("Exiting \n");
            exit(0);
        }
    }
    exit(1);
}

init_server是创建套接字的函数:

int initserver(int type, const struct sockaddr *addr, socklen_t alen, int qlen)
{
    int fd, err;
    int reuse = 1;
    if ((fd = socket(addr->sa_family, type, 0))<0)
    {
        return (-1);
    }
    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int))<0)
    {
        goto errout;
    }
    if(bind(fd, addr, alen)<0)
    {
        goto errout;
    }
    if (type == SOCK_STREAM || type == SOCK_SEQPACKET)
    {
        if(listen(fd, qlen)<0)
        {
            goto errout;
        }
    }
    return fd;
    errout:
        err = errno;
        close (fd);
        errno = err;
        return(-1);
}

如您所见,我使用了SOCK_STREAM用于 TCP 连接的套接字。该应用程序有效。

现在我想将应用程序转换为使用 SCTP 协议。为此,我尝试使用SOCK_SEQPACKET而不是SOCK_STREAM. 我在 OSX 和 Ubuntu 上都试过这个程序。在前者,函数getaddrinfo返回错误Bad hints,而在后者,main程序退出而不开始服务(条件if ((sockfd = initserver(...))>=0)永远不满足)。

如何将我的 TCP 应用程序转换为 SCTP 应用程序?

标签: csocketsunixserversystems-programming

解决方案


推荐阅读