c - 如何将 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 应用程序?
解决方案
推荐阅读
- sql - 理解查询:为每个商店选择最昂贵的产品
- scala - 什么时候执行 Scala 宏注解?(宏观天堂)
- css - 如何使用 CSS 定位仅包含空格()的元素?
- css - Angular-6-datatables 响应式样式
- python - 为什么我的编码器和解码器的参数在我的自动编码器中不对称?
- java - 使用java 10.0.2版本的java接口中的默认方法仍然不起作用
- html - 物化;模态显示来自正文的按钮
- java - 如何在 Intellij 2019.1 中删除光标后面的行注释?
- python - MySQL查询返回旧结果
- download - 使用 Web API Core 和 Angular 7 下载文件