sockets(套接字)编程有三种,流式套接字(sock_stream),数据报套接字(sock_dgram),原始套接字(sock_raw);基于tcp的socket编程是采用的流式套接字。
服务器端编程的步骤:
1:加载套接字库,创建套接字(wsastartup()/socket());
2:绑定套接字到一个ip地址和一个端口上(bind());
3:将套接字设置为监听模式等待连接请求(listen());
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:用返回的套接字和客户端进行通信(send()/recv());
6:返回,等待另一连接请求;
7:关闭套接字,关闭加载的套接字库(closesocket()/wsacleanup())。
客户端编程的步骤:
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/wsacleanup())。
第一式: 加载/释放winsock库:
1.加载方法:
wsadata wsa; /*初始化socket资源*/ if (wsastartup(makeword(1,1),&wsa) != 0) { return; //代表失败 }
2.释放方法:
wsacleanup();
第二式: 构造socket:
1.服务端:构造监听socket,流式socket.
socket listen_sock = socket(af_inet, sock_stream, 0)
2.客户端:构造通讯socket,流式socket.
socketclient_sock = socket(af_inet, sock_stream, 0)
第三式:配置监听地址和端口:
1.服务端: sockaddr_in serveraddr
zeromemory((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = af_inet;
serveraddr.sin_port = htons(1234); /*本地监听端口:1234*/
serveraddr.sin_addr.s_addr = htonl(inaddr_any); /*有ip*/
第四式: 绑定socket:
1.服务端:绑定监听socket.
bind(listen_sock,(struct sockaddr *)&serveraddr,sizeof(serveraddr))
第五式: 服务端/客户端连接:
1.服务端:等待客户端接入.
socket command_sock = accept(listen_sock, ...)
2.客户端:请求与服务端连接.
int ret = connect(client_sock, ...)
第六式: 收/发数据:
1.服务端:等待客户端接入.char buf[1024].
接收数据:recv(command_sock,buf, ...)
或
发送数据:send(command_sock,buf, ...)
2.客户端:请求与服务端连接.char buf[1024].
发送数据:send(client_sock,buf, ...)
接收数据:recv(client_sock,buf, ...)
第七式: 关闭socket:
1.服务端:关闭socket.
closesocket(listen_sock)
closesocket(command_sock)
2.客户端:关闭socket.
closesocket(client_sock)
?
<code>#include <stdio.h></code>
<code>#include <winsock2.h></code>
<code>void</code><code>main()</code>
<code>{</code>
<code></code><code>word</code><code>wversionrequested;</code>
<code></code><code>wsadata wsadata;</code>
<code></code><code>int</code><code>err;</code>
<code></code>
<code></code><code>wversionrequested = makeword( 1, 1 );</code>
<code></code><code>err = wsastartup( wversionrequested, &wsadata );</code>
<code></code><code>if</code><code>( err != 0 ) {</code>
<code></code><code>return</code><code>;</code>
<code></code><code>}</code>
<code></code><code>if</code><code>( lobyte( wsadata.wversion ) != 1 ||</code>
<code></code><code>hibyte( wsadata.wversion ) != 1 ) {</code>
<code></code><code>wsacleanup( );</code>
<code></code><code>socket socksrv=socket(af_inet,sock_stream,0);</code>
<code></code><code>sockaddr_in addrsrv;</code>
<code></code><code>addrsrv.sin_addr.s_un.s_addr=htonl(inaddr_any);</code>
<code></code><code>addrsrv.sin_family=af_inet;</code>
<code></code><code>addrsrv.sin_port=htons(6000);</code>
<code></code><code>bind(socksrv,(sockaddr*)&addrsrv,</code><code>sizeof</code><code>(sockaddr));</code>
<code></code><code>listen(socksrv,5);</code>
<code></code><code>sockaddr_in addrclient;</code>
<code></code><code>int</code><code>len=</code><code>sizeof</code><code>(sockaddr);</code>
<code></code><code>while</code><code>(1)</code>
<code></code><code>{</code>
<code></code><code>socket sockconn=accept(socksrv,(sockaddr*)&addrclient,&len);</code>
<code></code><code>char</code><code>sendbuf[50];</code>
<code></code><code>sprintf</code><code>(sendbuf,</code><code>"welcome %s to here!"</code><code>,inet_ntoa(addrclient.sin_addr));</code>
<code></code><code>send(sockconn,sendbuf,</code><code>strlen</code><code>(sendbuf)+1,0);</code>
<code></code><code>char</code><code>recvbuf[50];</code>
<code></code><code>recv(sockconn,recvbuf,50,0);</code>
<code></code><code>printf</code><code>(</code><code>"%s\n"</code><code>,recvbuf);</code>
<code></code><code>closesocket(sockconn);</code>
<code>}</code>

