当前位置: 技术问答>linux和unix
sctp的问题
来源: 互联网 发布时间:2016-11-18
本文导语: 我在2.6.14.7kernel的linux上测试SCTP,sctp版本1.04-1 用Select模型接收数据 如下方法发送数据 if(FD_ISSET(fileno(stdin), &rdfds)) { memset(kb_input,0,64); fgets(kb_input,64,stdin); kb_input[strlen(kb_input)-1] = 0x00; if (strcmp...
我在2.6.14.7kernel的linux上测试SCTP,sctp版本1.04-1
用Select模型接收数据
如下方法发送数据
if(FD_ISSET(fileno(stdin), &rdfds))
{
memset(kb_input,0,64);
fgets(kb_input,64,stdin);
kb_input[strlen(kb_input)-1] = 0x00;
if (strcmp(kb_input,"quit")== 0) exit(0);
printf("send %s to servern",kb_input);
ret = sctp_sendmsg(dc_connect_socket,
(void *)kb_input, strlen(kb_input),
(struct sockaddr *)&servaddr, sizeof(servaddr),0, 0, 0, 0, 0 );
}
对方可以接收到数据。
但是,如果这样写:
if(FD_ISSET(fileno(stdin), &rdfds))
{
memset(kb_input,0,64);
fgets(kb_input,64,stdin);
kb_input[strlen(kb_input)-1] = 0x00;
if (strcmp(kb_input,"quit")== 0) exit(0);
printf("send %s to servern",kb_input);
ret = sctp_sendmsg(dc_connect_socket,
(void *)kb_input, 64,
(struct sockaddr *)&servaddr, sizeof(servaddr),0, 0, 0, 0, 0 );
}
对方就接收不到数据。(只是将发送数据的长度修改了一下)。
现象是,在对方的计算机上抓包可以看到数据发送过来了,但是,接收数据方判断FD_ISSET(socket,&rfdset) 不通过。程序进入不了接收函数。
请问是不是正常,如何解决,谢谢
用Select模型接收数据
如下方法发送数据
if(FD_ISSET(fileno(stdin), &rdfds))
{
memset(kb_input,0,64);
fgets(kb_input,64,stdin);
kb_input[strlen(kb_input)-1] = 0x00;
if (strcmp(kb_input,"quit")== 0) exit(0);
printf("send %s to servern",kb_input);
ret = sctp_sendmsg(dc_connect_socket,
(void *)kb_input, strlen(kb_input),
(struct sockaddr *)&servaddr, sizeof(servaddr),0, 0, 0, 0, 0 );
}
对方可以接收到数据。
但是,如果这样写:
if(FD_ISSET(fileno(stdin), &rdfds))
{
memset(kb_input,0,64);
fgets(kb_input,64,stdin);
kb_input[strlen(kb_input)-1] = 0x00;
if (strcmp(kb_input,"quit")== 0) exit(0);
printf("send %s to servern",kb_input);
ret = sctp_sendmsg(dc_connect_socket,
(void *)kb_input, 64,
(struct sockaddr *)&servaddr, sizeof(servaddr),0, 0, 0, 0, 0 );
}
对方就接收不到数据。(只是将发送数据的长度修改了一下)。
现象是,在对方的计算机上抓包可以看到数据发送过来了,但是,接收数据方判断FD_ISSET(socket,&rfdset) 不通过。程序进入不了接收函数。
请问是不是正常,如何解决,谢谢
|
1、從你描述的過程看,你應該是client端吧,init 和cookie_echo是你發出去的吧
2、SCTP建立需要四條消息交互init、init_ack、cookie_echo、cookie_ack。現在你發出去cookie_echo了,但是
沒有收到對方的cookie_ack,對吧?
3、你的cookie_echo裏面帶了data chunk,而server端對這個data chunk的處理不正常,導致不會發cookie_ack
給你,對吧?
你先回答我下,上面我的猜測對不對。然後你能否抓個wireshark的trace上來看看呢?
2、SCTP建立需要四條消息交互init、init_ack、cookie_echo、cookie_ack。現在你發出去cookie_echo了,但是
沒有收到對方的cookie_ack,對吧?
3、你的cookie_echo裏面帶了data chunk,而server端對這個data chunk的處理不正常,導致不會發cookie_ack
給你,對吧?
你先回答我下,上面我的猜測對不對。然後你能否抓個wireshark的trace上來看看呢?
|
现象是,在对方的计算机上抓包可以看到数据发送过来了,但是,接收数据方判断FD_ISSET(socket,&rfdset) 不通过。程序进入不了接收函数。
接受方的也是select?你先用ethreal抓包看看,我觉得发送应该是成功的,你先确认是否有收到包先。
接受方的也是select?你先用ethreal抓包看看,我觉得发送应该是成功的,你先确认是否有收到包先。
|
信箱已经私信mail给你了,请按照私信中写的做,谢谢!
|
Like TCP, SCTP provides reliable, connection oriented data delivery with congestion control. Unlike TCP, SCTP also provides message boundary preservation, ordered and unordered message delivery, multi-streaming and multi-homing. Detection of data corruption, loss of data and duplication of data is achieved by using checksums and sequence numbers. A selective retransmission mechanism is applied to correct loss or corruption of data.
|
只要對端能收到,就說明連接是沒問題的,我覺得這個問題不是出在SCTP協議上,而是出在函數調用或者消息凈
荷上。SCTP的四次握手連接已經沒問題了,連接已經建立了,如果基於這個連結的消息傳遞不正常,通常都不是
SCTP的問題了,應該從消息上分析。建議你去查一下sctp_sendmsg()這個函數的詳細說明
如果有問題可以貼上來,SCTP這個我還是比較熟悉的
荷上。SCTP的四次握手連接已經沒問題了,連接已經建立了,如果基於這個連結的消息傳遞不正常,通常都不是
SCTP的問題了,應該從消息上分析。建議你去查一下sctp_sendmsg()這個函數的詳細說明
如果有問題可以貼上來,SCTP這個我還是比較熟悉的