4.7.3 Socket 通信的实现

4.7.3 Socket 通信的实现

在Windows编写网络应程序,基本上都是利用Socket 套接字进行数据通信,分为服务器端套接字和客户端套接字两个设计部分。

1.服务器端程序

服务器端首先启动,通过调用socket ( ) 建立一个Socket,然后调用bind ( ) 将该Socket和本地网络地址联系在一起,再调用listen ( ) 使Socket 做好侦听的准备,并规定它的请求队列的长度,之后就调用accept ( ) 来接收连接。连接建立后,服务器端创建一个通信用的Socket,接着服务器端就可以通过recv ( ) 和send ( ) 来接收和发送数据。最后,待数据传送结束后,调用close ( ) 关闭Socket。

(1)创建服务器端套接字:

memset ( &hints , 0 , sizeof (hints) ) ;

hints.ai_family = AF_INET6 ; / / 指定用IP V6 协议

hints.ai_socktype = S OCK_S TREAM; / / 指定用字节流

hints.ai_protocol = IP PRO TO_TCP ; / / 指定用TCP 协议

hints.ai_flags = AI_NUMERICHOS T ; / / IP 用数字表示

rc = getaddrinfo (“: :1”,“5001”, &hints , &res) ; / / 解析本机地址

s_send = socket (res- > ai _family , res - > ai _ socktype , res- > ai _ protocol) ;

/ / 创建socket

(2)绑定本机监听端口:

rc = bind(s_ send ,res - > ai_ addr ,res - > ai _ addrlen) ;

(3)监听并接受连接:

listen(s _send ,5) ; / / 创建连接队列,开始监听

new_fd = accept ( s_ send , ( struct sockaddr *) &sin , &sin_len) ; / / 接受一个连接

(4)接收数据:

recv(new_fd ,buf ,sizeof (buf) ,0) ; / / 接受数据到buf

printf (“recv : %s”,buf) ; / / 打印接受的数据

(5)关闭套接字:

close (s_ send ) ;

2.客户端程序设计

客户端创建一个Socket,并调用connect ( ) 和服务器建立连接。连接建立后,客户端就可以通过recv ( ) 和send ( ) 来接收和发送数据。最后,待数据传送结束后,调用close ( ) 关闭Socket。

(1)创建客户端套接字:

memset ( &hints , 0 , sizeof (hints) ) ;

hints.ai _family = AF_INET6 ; / / 指定用IP V6 协议

hints.ai _socktype = S OCK _STREAM; / / 指定用字节流

hints.ai _protocol = IP PROTO _TCP ; / / 指定用TCP 协议

hints.ai _flags = AI _NUMERICHOS T ; / / IP 用数字表示

rc = getaddrinfo (“3ffe : 3211 : : 1 ”, “5001 ”, &hints ,&res) ;/ / 解析服务器地址

s_send = socket (res - > ai_family , res - > ai_socktype , res- > ai _protocol) ; / / 创建socket

(2)连接服务器:

connect (s _send ,res - > ai _ addr ,res - > ai_ addrlen) ;

(3)发送数据:

send(s _send ,buf ,sizeof (buf) ,0) ;

(4)关闭套接字:

close (s_ send) ;