SCTP一对多模式的服务器端代码怎么写
发表于:2024-10-11 作者:千家信息网编辑
千家信息网最后更新 2024年10月11日,今天就跟大家聊聊有关SCTP一对多模式的服务器端代码怎么写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。以下源码是基于linux操作系统的。实
千家信息网最后更新 2024年10月11日SCTP一对多模式的服务器端代码怎么写
今天就跟大家聊聊有关SCTP一对多模式的服务器端代码怎么写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
以下源码是基于linux操作系统的。实现了基于SCTP协议的一对多模式的服务器端代码,该段不但处理的用户数据,而且处理了的通知类的消息,即notification消息。
#include#include #include #include #include #include #include #include #include static void handle_event(void *buf){ struct sctp_assoc_change *sac; struct sctp_send_failed *ssf; struct sctp_paddr_change *spc; struct sctp_remote_error *sre; struct sctp_shutdown_event *sse; union sctp_notification *snp; snp = (sctp_notification*)buf; switch (snp->sn_header.sn_type) { case SCTP_ASSOC_CHANGE: { sac = &snp->sn_assoc_change; printf("assoc_change: state=%hu, error=%hu, instr=%hu outstr=%hu associd=%d\n", sac->sac_state, sac->sac_error, sac->sac_inbound_streams, sac->sac_outbound_streams, sac->sac_assoc_id); break; } case SCTP_SEND_FAILED: { ssf = &snp->sn_send_failed; printf("sendfailed: len=%hu err=%d assoc_i=%d ssf_data=%d\n", ssf->ssf_length, ssf->ssf_error, ssf->ssf_assoc_id, ssf->ssf_data[0]); break; } case SCTP_PEER_ADDR_CHANGE: { spc = &snp->sn_paddr_change; struct sockaddr_in *sin = (struct sockaddr_in *)&spc->spc_aaddr; char addrbuf[INET6_ADDRSTRLEN]; inet_ntop(AF_INET, &sin->sin_addr, addrbuf, INET6_ADDRSTRLEN); printf("peeraddrchange: %s state=%d, error=%d\n", addrbuf, spc->spc_state, spc->spc_error); break; } case SCTP_REMOTE_ERROR: { sre = &snp->sn_remote_error; printf("remote_error: err=%hu len=%hu\n", ntohs(sre->sre_error), ntohs(sre->sre_length)); break; } case SCTP_SHUTDOWN_EVENT: { sse = &snp->sn_shutdown_event; printf("shutdown event: assoc_id=%d\n", sse->sse_assoc_id); break; } default: { printf("unknown type: %hu\n", snp->sn_header.sn_type); break; } }}int main(int agrc, char* agrv[]){ /* Create a 1-to-many style SCTP socket. */ int fd = -1; if ((fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0) { perror("socket"); exit(1); } /* Enable all notifications and events */ struct sctp_event_subscribe event; event.sctp_data_io_event = 1; event.sctp_association_event = 1; event.sctp_address_event = 1; event.sctp_send_failure_event = 1; event.sctp_peer_error_event = 1; event.sctp_shutdown_event = 1; event.sctp_partial_delivery_event = 1; event.sctp_adaption_layer_event = 1; if (setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(event)) != 0) { perror("setevent failed"); exit(1); } /* Configure auto-close timer. */ int timeout = 5; if (setsockopt(fd, IPPROTO_SCTP, SCTP_AUTOCLOSE, &timeout, 4) < 0) { perror("setsockopt SCTP_AUTOCLOSE"); exit(1); } /* Bind the socket to all local addresses. */ struct sockaddr_in sin; bzero((char*)&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(19000); sin.sin_addr.s_addr = inet_addr("192.168.10.120"); if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) { perror("bind"); exit(1); } /* Enable accepting associations. */ if (listen(fd, 1) < 0) { perror("listen"); exit(1); } char buffer[256]; int bufferlen = 256; bzero(buffer, bufferlen); struct sockaddr_in clientaddr; int fromlen = sizeof(clientaddr); struct sctp_sndrcvinfo sndrcvinfo; int msg_flag; while(true) { int length = sctp_recvmsg(fd, buffer, bufferlen, (struct sockaddr*)&clientaddr, (socklen_t*)&fromlen, &sndrcvinfo, &msg_flag); if (msg_flag & MSG_NOTIFICATION) { printf("****************************************************\n"); printf("Event: notificaiton length=%d\n", length); handle_event((void*)buffer); } else { printf("****************************************************\n"); printf("Event: data event length=%d\n", length); char addrbuf[100]; inet_ntop(AF_INET, &clientaddr.sin_addr, addrbuf, INET6_ADDRSTRLEN); int port = ntohs(clientaddr.sin_port); printf("data from=%s:%d\n", addrbuf, port); printf("data=%s\n", buffer); } } if (close(fd) < 0) { perror("close"); exit(1); } return (0);}
看完上述内容,你们对SCTP一对多模式的服务器端代码怎么写有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
代码
服务器
模式
服务
内容
消息
处理
操作系统
数据
更多
源码
用户
知识
篇文章
系统
行业
资讯
资讯频道
频道
进一
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
万师傅网络技术有限公司
怎么查看有几个数据库实例
编写一个数据库多少钱
华为网络技术大赛决赛资料
岛津气质数据库最新版
热力学数据库网站
e4A数据库添加下拉列表中
宁波电子网络技术咨询热线
网络技术就业方向选择
信息化项目软件开发费用规范
软件开发需要注册几类商标
茂南区天网络技术服务部QQ
机架服务器家用
吉林省广通网络技术
vmware多台服务器集群
服务器可以访问公网ip吗
绍兴esop软件开发
建立服务器远程连接
ftp服务器建模
商洛网络技术操作
中国联通网络技术研究院级别
返空汇网络技术短信是什么
人民银行金融业网络安全
螳螂下载软件开发
数据库创建表的语句是
绝地求生服务器跑步
网络技术开发规范
网络安全审查办公室设在__
悦购互联网科技
网络安全川大研究生