本文共 1216 字,大约阅读时间需要 4 分钟。
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);
}
#
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;
}
抓取报文后发现三次握手成功,也就说不用调用accept就可以三次握手。
客户端代码调用shutdown时,报文中发现fin报文,也就是说调用shutdown是关tcp连接。
调用shutdown后,再调read没有返回-1,而是返回0,这倒没有预料到。后来证实,直接掉close,再read会返回-1,错误原因:bad descriptor.
验证了之前的猜想,socket只不过是个文件,关联了协议栈中的Tcp资源,调close是把文件和协议栈资源一起释放。而调shutdown是先释放协议栈中资源。再调用close就不发送fin了,只关socket文件描述符。
转载地址:http://uuesi.baihongyu.com/