天天看點

C++ Socket程式設計步驟

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 &lt;stdio.h&gt;</code>

<code>#include &lt;winsock2.h&gt;</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, &amp;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*)&amp;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*)&amp;addrclient,&amp;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>

C++ Socket程式設計步驟
C++ Socket程式設計步驟