socket之shutdown发送FIN测试

来源:互联网 发布:python 蓝牙读取 编辑:程序博客网 时间:2024/06/13 19:47
服务器:arm7管理板 vxworks5.5
程序运转起来后,手动调用使socket监听
void Shut(void)
{
    int Sfd;
    struct sockaddr_in Sa;

    Sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    Sa.sin_family = AF_INET;
    Sa.sin_port = htons(103);
    Sa.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(Sfd, (struct sockaddr*)&Sa,sizeof(Sa));
    listen(Sfd, 5);      
}
 
 
客户端运行于ubuntu10.04上
 
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
int main( )
{
    int                Cfd, ret;
    struct sockaddr_in Ca;
    char               buf[20];

    Cfd                = socket( AF_INET, SOCK_STREAM,0 );
    Ca.sin_family      = AF_INET;
    Ca.sin_port        = htons( 103 );
    Ca.sin_addr.s_addr = inet_addr( "222.111.112.204" ); //已经默认转为大端模式

    ret = connect( Cfd, (struct sockaddr*)&Ca,sizeof( Ca ) );
    getchar( );
    if( ret >= 0 )
    {
        shutdown( Cfd, 2 );
    }
    getchar( );
    ret = read( Cfd, buf, 19 );
    printf( "read return %d", ret ); //代码验证返回0
    if( ret < 0 )
    {
        perror( "read error" );
    }
    getchar( );
    return 0;
}
 
  1. 抓取报文后发现三次握手成功,也就说不用调用accept就可以三次握手。
  2. 客户端代码调用shutdown时,报文中发现fin报文,也就是说调用shutdown是关tcp连接。
  3. 调用shutdown后,再调read没有返回-1,而是返回0,这倒没有预料到。后来证实,直接掉close,再read会返回-1,错误原因:bad descriptor.
  4. 验证了之前的猜想,socket只不过是个文件,关联了协议栈中的Tcp资源,调close是把文件和协议栈资源一起释放。而调shutdown是先释放协议栈中资源。再调用close就不发送fin了,只关socket文件描述符。