content_views"
class="markdown_views prism-atom-one-dark">
包含头文件
<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><winsock2.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>
code>
需要链接的库文件
<code class="prism language-c">ws2_32class="token punctuation">.lib
code>
winsocket初始化
<code class="prism language-c">WSADATA wsaDataclass="token punctuation">;
SOCKET serverSocketclass="token punctuation">, clientSocketclass="token punctuation">;
class="token keyword">struct class="token class-name">sockaddr_in serverAddr class="token operator">= class="token punctuation">{ class="token number">0x00 class="token punctuation">}class="token punctuation">;
class="token keyword">struct class="token class-name">sockaddr_in clientAddr class="token operator">= class="token punctuation">{ class="token number">0x00 class="token punctuation">}class="token punctuation">;
class="token keyword">int clientAddrLen class="token operator">= class="token keyword">sizeofclass="token punctuation">(clientAddrclass="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(class="token function">WSAStartupclass="token punctuation">(class="token function">MAKEWORDclass="token punctuation">(class="token number">2class="token punctuation">, class="token number">2class="token punctuation">)class="token punctuation">, class="token operator">&wsaDataclass="token punctuation">) class="token operator">!= class="token number">0class="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"WSAStartup failed.\n"class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>
创建winsocket
<code class="prism language-c">class="token keyword">if class="token punctuation">(class="token punctuation">(serverSocket class="token operator">= class="token function">socketclass="token punctuation">(AF_INETclass="token punctuation">, SOCK_STREAMclass="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">) class="token operator">== INVALID_SOCKETclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Socket failed.\n"class="token punctuation">)class="token punctuation">;class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>
IP及端口号配置
<code class="prism language-c">serverAddrclass="token punctuation">.sin_family class="token operator">= AF_INETclass="token punctuation">;
serverAddrclass="token punctuation">.sin_addrclass="token punctuation">.s_addr class="token operator">= INADDR_ANYclass="token punctuation">;
serverAddrclass="token punctuation">.sin_port class="token operator">= class="token function">htonsclass="token punctuation">(class="token number">9988class="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(class="token function">bindclass="token punctuation">(serverSocketclass="token punctuation">, class="token punctuation">(class="token keyword">struct class="token class-name">sockaddrclass="token operator">*class="token punctuation">)class="token operator">&serverAddrclass="token punctuation">, class="token keyword">sizeofclass="token punctuation">(serverAddrclass="token punctuation">)class="token punctuation">) class="token operator">== SOCKET_ERRORclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Bind failed.\n"class="token punctuation">)class="token function">closesocketclass="token punctuation">(serverSocketclass="token punctuation">)class="token punctuation">;class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>
监听客户端连接
<code class="prism language-c">class="token keyword">if class="token punctuation">(class="token function">listenclass="token punctuation">(serverSocketclass="token punctuation">, class="token number">5class="token punctuation">) class="token operator">== SOCKET_ERRORclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Listen failed.\n"class="token punctuation">)class="token punctuation">;class="token function">closesocketclass="token punctuation">(serverSocketclass="token punctuation">)class="token punctuation">;class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>
接受客户端连接
<code class="prism language-c">class="token keyword">if class="token punctuation">(class="token punctuation">(clientSocket class="token operator">= class="token function">acceptclass="token punctuation">(serverSocketclass="token punctuation">, class="token punctuation">(class="token keyword">struct class="token class-name">sockaddrclass="token operator">*class="token punctuation">)class="token operator">&clientAddrclass="token punctuation">, class="token operator">&clientAddrLenclass="token punctuation">)class="token punctuation">) class="token operator">== INVALID_SOCKETclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Accept failed.\n"class="token punctuation">)class="token punctuation">;class="token function">closesocketclass="token punctuation">(serverSocketclass="token punctuation">)class="token punctuation">;class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>
接收数据
<code class="prism language-c">class="token keyword">int bytesReceived class="token operator">= class="token function">recvclass="token punctuation">(clientSocketclass="token punctuation">, class="token punctuation">(class="token keyword">charclass="token operator">*class="token punctuation">)class="token punctuation">(_sRxBuffer class="token operator">+ _sRxLenghtclass="token punctuation">)class="token punctuation">, BUFFER_SIZEclass="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">;
code>
发送数据
<code class="prism language-c">class="token keyword">int txPacketlenght class="token operator">= class="token function">sendclass="token punctuation">(socketclass="token punctuation">, class="token punctuation">(class="token keyword">const class="token keyword">charclass="token operator">*class="token punctuation">)_sTxBufferclass="token punctuation">, txPacketlenghtclass="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">;
code>
回收winsocket资源
<code class="prism language-c">class="token function">closesocketclass="token punctuation">(clientSocketclass="token punctuation">)class="token punctuation">;
class="token function">closesocketclass="token punctuation">(serverSocketclass="token punctuation">)class="token punctuation">;
class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
code>
检查连接断开情形
<code class="prism language-c">class="token keyword">int bytesReceived class="token operator">= class="token function">recvclass="token punctuation">(clientSocketclass="token punctuation">, bufferclass="token punctuation">, bufferSizeclass="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">;
class="token keyword">if class="token punctuation">(bytesReceived class="token operator">== class="token number">0class="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Client socket disconnected gracefully.\n"class="token punctuation">)class="token punctuation">;
class="token punctuation">} class="token keyword">else class="token keyword">if class="token punctuation">(bytesReceived class="token operator">== SOCKET_ERRORclass="token punctuation">) class="token punctuation">{class="token keyword">int error class="token operator">= class="token function">WSAGetLastErrorclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(error class="token operator">== WSAECONNRESETclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Client socket disconnected unexpectedly.\n"class="token punctuation">)class="token punctuation">;class="token punctuation">} class="token keyword">else class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Recv failed with error: %d\n"class="token punctuation">, errorclass="token punctuation">)class="token punctuation">;class="token punctuation">}
class="token punctuation">}
code>