SCTP一到多式流分回射服程序
一、服务器程序
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/sctp.h> #define LISTENQ 1024
#define BUFFSIZE 4096
#define SERV_PORT 9877 #define SA struct sockaddr int sctp_get_no_strms(int, struct sockaddr *, socklen_t);
sctp_assoc_t sctp_address_to_associd(int, struct sockaddr *, socklen_t); int main(int argc, char **argv)
{
int sock_fd,msg_flags;
char readbuf[BUFFSIZE];
struct sockaddr_in servaddr, cliaddr;
struct sctp_sndrcvinfo sri;
struct sctp_event_subscribe evnts;
int stream_increment=;
socklen_t len;
size_t rd_sz; if (argc == ) {
stream_increment = atoi(argv[]);
}
sock_fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT); bind(sock_fd, (SA *) &servaddr, sizeof(servaddr)); bzero(&evnts, sizeof(evnts));
evnts.sctp_data_io_event = ;
setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,
&evnts, sizeof(evnts)); listen(sock_fd, LISTENQ); for ( ; ; ) {
len = sizeof(struct sockaddr_in);
rd_sz = sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),
(SA *)&cliaddr, &len,
&sri,&msg_flags); if(stream_increment) {
sri.sinfo_stream++;
if(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr,
len)) {
sri.sinfo_stream = ;
}
}
sctp_sendmsg(sock_fd, readbuf, rd_sz,
(SA *)&cliaddr, len,
sri.sinfo_ppid,
sri.sinfo_flags,
sri.sinfo_stream,
,
);
}
} int sctp_get_no_strms(int sock_fd,struct sockaddr *to, socklen_t tolen)
{
int retsz;
struct sctp_status status;
retsz = sizeof(status);
bzero(&status,sizeof(status)); status.sstat_assoc_id = sctp_address_to_associd(sock_fd,to,tolen);
getsockopt(sock_fd,IPPROTO_SCTP, SCTP_STATUS,
&status, &retsz);
return (status.sstat_outstrms);
} sctp_assoc_t sctp_address_to_associd(int sock_fd,
struct sockaddr *sa, socklen_t salen)
{
struct sctp_paddrparams sp;
int siz; siz = sizeof(struct sctp_paddrparams);
bzero(&sp,siz);
memcpy(&sp.spp_address,sa,salen);
sctp_opt_info(sock_fd,,
SCTP_PEER_ADDR_PARAMS, &sp, &siz);
return (sp.spp_assoc_id);
}
二、客户端程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/sctp.h> #define MAXLINE 4096
#define SERV_PORT 9877
#define SCTP_MAXLINE 800
#define SERV_MAX_SCTP_STRM 10 #define SA struct sockaddr void err_quit(const char *, ...);
void sctpstr_cli(FILE *, int, struct sockaddr *, socklen_t);
void sctpstr_cli_echoall(FILE *, int, struct sockaddr *, socklen_t); int main(int argc, char **argv)
{
int sock_fd;
char *byemsg;
struct sockaddr_in servaddr;
struct sctp_event_subscribe evnts;
int echo_to_all=; if(argc < ) {
err_quit("Missing host argument - use '%s host [echo]'\n",argv[]);
}
if(argc > ) {
printf("Echoing messages to all streams\n");
echo_to_all = ;
}
sock_fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_pton(AF_INET, argv[], &servaddr.sin_addr); bzero(&evnts, sizeof(evnts));
evnts.sctp_data_io_event = ;
setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,&evnts, sizeof(evnts)); if(echo_to_all == ) {
sctpstr_cli(stdin, sock_fd, (SA *)&servaddr, sizeof(servaddr));
} else {
sctpstr_cli_echoall(stdin, sock_fd, (SA *)&servaddr, sizeof(servaddr));
} close(sock_fd); return();
} void sctpstr_cli(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)
{
struct sockaddr_in peeraddr;
struct sctp_sndrcvinfo sri;
char sendline[MAXLINE], recvline[MAXLINE];
socklen_t len;
int out_sz,rd_sz;
int msg_flags; bzero(&sri,sizeof(sri));
while (fgets(sendline, MAXLINE, fp) != NULL) {
if(sendline[] != '[' && sendline[] != ']') {
printf("Error, line must be of the form '[streamnum]text'\n");
continue;
}
sri.sinfo_stream = strtol(&sendline[],NULL,);
out_sz = strlen(sendline);
int d = sctp_sendmsg(sock_fd, sendline, out_sz,
to, tolen,
, ,
sri.sinfo_stream,
, ); printf("d = %d\n", d); len = sizeof(peeraddr);
rd_sz = sctp_recvmsg(sock_fd, recvline, sizeof(recvline),
(SA *)&peeraddr, &len,
&sri,&msg_flags); printf("rd_sz = %d\n", rd_sz); printf("From str:%d seq:%d (assoc:0x%x):",
sri.sinfo_stream,sri.sinfo_ssn,
(u_int)sri.sinfo_assoc_id);
printf("%.*s",rd_sz,recvline);
}
} void sctpstr_cli_echoall(FILE *fp, int sock_fd, struct sockaddr *to,
socklen_t tolen)
{
struct sockaddr_in peeraddr;
struct sctp_sndrcvinfo sri;
char sendline[SCTP_MAXLINE], recvline[SCTP_MAXLINE];
socklen_t len;
int rd_sz,i,strsz;
int msg_flags; bzero(sendline,sizeof(sendline));
bzero(&sri,sizeof(sri));
while (fgets(sendline, SCTP_MAXLINE - , fp) != NULL) {
strsz = strlen(sendline);
if(sendline[strsz-] == '\n') {
sendline[strsz-] = '\0';
strsz--;
}
for(i=;i<SERV_MAX_SCTP_STRM;i++) {
snprintf(sendline + strsz, sizeof(sendline) - strsz,
".msg.%d", i);
sctp_sendmsg(sock_fd, sendline, sizeof(sendline),
to, tolen,
, ,
i,
, );
}
for(i=;i<SERV_MAX_SCTP_STRM;i++) {
len = sizeof(peeraddr);
rd_sz = sctp_recvmsg(sock_fd, recvline, sizeof(recvline),
(SA *)&peeraddr, &len,
&sri,&msg_flags);
printf("From str:%d seq:%d (assoc:0x%x):",
sri.sinfo_stream,sri.sinfo_ssn,
(u_int)sri.sinfo_assoc_id);
printf("%.*s\n",rd_sz,recvline);
}
}
}
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h> /* ANSI C header file */
#include <syslog.h> /* for syslog() */ #define MAXLINE 4096 int daemon_proc; /* set nonzero by daemon_init() */ static void err_doit(int, int, const char *, va_list); /* Nonfatal error related to system call
* Print message and return */ void err_ret(const char *fmt, ...) { va_list ap; va_start(ap, fmt);
err_doit(, LOG_INFO, fmt, ap);
va_end(ap);
return;
} /* Fatal error related to system call
* Print message and terminate */ void err_sys(const char *fmt, ...) { va_list ap; va_start(ap, fmt);
err_doit(, LOG_ERR, fmt, ap);
va_end(ap);
exit();
} /* Fatal error related to system call
* Print message, dump core, and terminate */ void err_dump(const char *fmt, ...) {
va_list ap; va_start(ap, fmt);
err_doit(, LOG_ERR, fmt, ap);
va_end(ap);
abort(); /* dump core and terminate */
exit(); /* shouldn't get here */
} /* Nonfatal error unrelated to system call
* Print message and return */ void err_msg(const char *fmt, ...) { va_list ap; va_start(ap, fmt);
err_doit(, LOG_INFO, fmt, ap);
va_end(ap);
return;
} /* Fatal error unrelated to system call
* Print message and terminate */ void err_quit(const char *fmt, ...) { va_list ap; va_start(ap, fmt);
err_doit(, LOG_ERR, fmt, ap);
va_end(ap);
exit();
} /* Print message and return to caller
* Caller specifies "errnoflag" and "level" */ static void err_doit(int errnoflag, int level, const char *fmt, va_list ap) { int errno_save, n;
char buf[MAXLINE + ]; errno_save = errno; /* value caller might want printed */
#ifdef HAVE_VSNPRINTF
vsnprintf(buf, MAXLINE, fmt, ap); /* safe */
#else
vsprintf(buf, fmt, ap); /* not safe */
#endif
n = strlen(buf);
if (errnoflag)
snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save));
strcat(buf, "\n"); if (daemon_proc) {
syslog(level, buf);
} else {
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(stderr);
}
return;
}
SCTP一到多式流分回射服程序的更多相关文章
- 【Unix网络编程】chapter5TCP回射服务器程序
chapter5 5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t ...
- TCP回射客户程序:str_cli函数
str_cli函数完成客户处理循环: 从标准输入读入一行文本,写到服务器上,读回服务器对该行的回射,并把回射行写到标准输出上 读入一行,写到服务器 fgets读入一行文本,writen把该行发送给服务 ...
- TCP回射服务器程序:str_echo函数
str_echo函数执行处理每个客户的服务: 从客户读入数据,并把它们回射给客户 读入缓冲区并回射其中内容: read函数从套接字读入数据,writen函数把其中内容回射给客户 如果客户关闭连接,那么 ...
- TCP回射服务器程序:main函数
TCP回射并发服务器 1.创建套接字,绑定服务器的众所周知端口 创建一个TCP套接字,在待绑定到该TCP套接字的网际网套接字地址结构中填入通配地址(INADDR_ANY) 和服务器的众所知周(SERV ...
- Linux下select的用法--实现一个简单的回射服务器程序
1.先看man手册 SYNOPSIS /* According to POSIX.1-2001 */ #include <sys/select.h> / ...
- TCP回射客户程序:main函数
创建套接字,装填网际网套接字地址结构 创建一个TCP套接字,用服务器的IP地址和端口号装填一个网际网套接字地址结构 我们可从命令行参数取得服务器的IP地址 从头文件unp.h取得服务器的众所周知端口号 ...
- UNIX网络编程——使用线程的TCP回射服务器程序
同一进程内的所有线程除了共享全局变量外还共享: (1)进程指令: (2)大多数数据: (3) 打开的文件(即描述符): (4)信号处理函数和信号处置: (5)当前工作目录: (6)用户ID和组ID. ...
- UNIX网络编程——使用select函数的TCP和UDP回射服务器程序
服务器程序: #include <sys/wait.h> #include <string.h> #include <string.h> #include < ...
- UNIX网络编程——UDP回射服务器程序(初级版本)以及漏洞分析
该函数提供的是一个迭代服务器,而不是像TCP服务器那样可以提供一个并发服务器.其中没有对fork的调用,因此单个服务器进程就得处理所有客户.一般来说,大多数TCP服务器是并发的,而大多数UDP服务器是 ...
随机推荐
- Finding Lines UVALive - 6955(随机)
给出n个点,问你有没有可能存在一条直线,这n个点中存在百分号p以上点在这条直线上. 两个点确定一条直线,所以可以随机枚举两个点,然后用这条直线去判断其他的点是不是在这条直线上,如果在这个直线上的点超过 ...
- LOJ6089 小Y的背包计数问题(根号优化背包)
Solutioon 这道题利用根号分治可以把复杂度降到n根号n级别. 我们发现当物品体积大与根号n时,就是一个完全背包,换句话说就是没有了个数限制. 进一步我们发现,这个背包最多只能放根号n个物品. ...
- 【php】php分隔字符串为数组
工作中会经常分隔字符串为数组,我们可以用php内置函数str_split(),可是有时候字符串中包含中文,切割后会乱码,比如 print_r(str_split('dw氛围fesf',3)); 输出 ...
- Mysql 允许远程连接
授权的方式允许任何主机访问mysql服务器: mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' W ...
- bzoj2086 Blocks
题目链接 题面 思路 可以发现其实就是询问一个最长的区间,使得这个区间的平均数大于等于k.所以将区间内所有数字减去k,然后做一遍前缀和.只要是前缀和之差大于等于0的区间.就是满足条件的. 所以现在问题 ...
- 在views中引用UserProfile报错RuntimeError: Model class apps.users.models.UserProfile doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
如图报错,在settings中,该加的也加了啊! 显然类似于网上最容易遇到的解决方案如下图,是没有任何意义的 只要在view中有 from .models import UserProfile,Ver ...
- python zip()函数的使用
解释: 后缀为zip的文件肯定都见过吧?zip是打包压缩好的一个文件,所以,zip()函数也简单的理解为打包压缩函数,将不同个数相同类型的字段结合在一起. 官方定义为:zip() 函数用于将可迭代的对 ...
- 字符类型char、字符串与字符数组、字符数组与数据数组区别
字符类型是以ASCII码值运算的:小写字母比相应的大写字母大32,其中A=65,a=97 Esc键 27(十进制).'\x1B'(十六进制).'\33'(八进制) 转义字符:\0 空字符 AS ...
- 高级组件——选项卡面板JTabbedPane
选项卡面板:JTabbedPane(标签位置,布局方式) 标签位置:JTabbedPane.TOP,JTabbedPane.BOTTOM,JTabbedPane.LEFT,JTabbedPane.RI ...
- 关键字(7):属性的增删改add,drop,modify
新建一张表: )); 注意:新建表时,表里面至少要有一个字段 删除整张表: drop table nac_user.a_bt; 增加表的一个属性: ) default('M') 新增外键 ...