sctp的问题

lif2000 2009-04-10 08:57:03
我在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 server\n",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 server\n",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) 不通过。程序进入不了接收函数。

请问是不是正常,如何解决,谢谢

...全文
488 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ben大神点C 2011-03-31
  • 打赏
  • 举报
回复
应该是checksum的校验不通过。

发送端的checksum会根据你传入的长度和该长度的消息内容,进行计算。
相应的接受端会先从接收到的数据中去出发送端计算的checksum,并根据接收到的数据流,重新计算checksum。
将两个checksum进行比较,如果相同则认为包是正常的,否则,视为非法。

所以,很明显,你这里放进去的数据只可能是<=28 /*strlen(kb_input)*/。这样发送端就会将你指定长度的数据发送过去。接收端同样也能取到相应的数据。
lif2000 2009-08-11
  • 打赏
  • 举报
回复
有新的发现了:
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 server\n",kb_input);
ret = sctp_sendmsg(dc_connect_socket,
(void *)kb_input, 28 /*strlen(kb_input)*/,
(struct sockaddr *)&peeraddr, sizeof(peeraddr),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 server\n",kb_input);
ret = sctp_sendmsg(dc_connect_socket,
(void *)kb_input, 29 /*strlen(kb_input)*/,
(struct sockaddr *)&peeraddr, sizeof(peeraddr),0, 0, 0, 0, 0 );

}

把发送长度的28改正29,对方就收不到
<=28,都没问题
>29,都不行

诡异
  • 打赏
  • 举报
回复
现象是,在对方的计算机上抓包可以看到数据发送过来了,但是,接收数据方判断FD_ISSET(socket,&rfdset) 不通过。程序进入不了接收函数。


接受方的也是select?你先用ethreal抓包看看,我觉得发送应该是成功的,你先确认是否有收到包先。
独孤过儿 2009-04-10
  • 打赏
  • 举报
回复
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上來看看呢?
lif2000 2009-04-10
  • 打赏
  • 举报
回复
SCTP的四次握手没有完成。
通过抓包,接收方可以收到Init,而且回复了Init_ack

此时发送方开始发送带数据的Cookie_echo data

如果接受方接受了数据,会给发送方回复Cookie_ack

但是,现在由于接收方FD_ISSER检测不到,没有接收数据,所以看不到Cookie_ack。

以后每次发送都只有一条Cookie_echo data
独孤过儿 2009-04-10
  • 打赏
  • 举报
回复
只要對端能收到,就說明連接是沒問題的,我覺得這個問題不是出在SCTP協議上,而是出在函數調用或者消息凈

荷上。SCTP的四次握手連接已經沒問題了,連接已經建立了,如果基於這個連結的消息傳遞不正常,通常都不是

SCTP的問題了,應該從消息上分析。建議你去查一下sctp_sendmsg()這個函數的詳細說明

如果有問題可以貼上來,SCTP這個我還是比較熟悉的
morris88 2009-04-10
  • 打赏
  • 举报
回复
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.
lif2000 2009-04-10
  • 打赏
  • 举报
回复
偶,Sorry,那个信箱我好长时间不用了。新的是li_fei1980@163.com

我找了一个sctp1.06版本的计算机,没有这个问题!怀疑这是1.04上的bug
独孤过儿 2009-04-10
  • 打赏
  • 举报
回复
信箱已经私信mail给你了,请按照私信中写的做,谢谢!
lif2000 2009-04-10
  • 打赏
  • 举报
回复
fetag:

对,您说的都对,我怎么把trace给你呢!

还有hairetz:
client 和 Server都是Select。 请留下信箱,我给你们发送抓包。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧