/*<br />服務端程式的編寫<br />1. 建立通訊端(Socket)<br />2. 將通訊端綁定到一個本地地址和連接埠上.(bind)<br />3. 將通訊端設為監聽模式,準備接收客戶請求(listen).<br />4. 等待客戶請求到來,當請求到來後,接收串連請求,返回一個新的對應於此次串連的通訊端(accept).<br />5. 用返回的通訊端和用戶端進行通訊(Send/Recv)<br />6. 返回等待另一個客戶請求.<br />7. 關閉通訊端</p><p>如下是服務端程式的代碼:</p><p>*/<br />#include "windows.h"<br />#include "winsock.h"<br />#include "stdio.h"</p><p>#pragma comment(lib,"ws2_32.lib")</p><p>struct A<br />{<br />int i;<br />long no;<br />char buf[10];<br />};</p><p>void main()<br />{<br />//載入通訊端庫<br />WORD wVersionRequested;<br />WSADATA wsaData;<br />int err;</p><p>wVersionRequested = MAKEWORD( 2, 2 );</p><p>err = WSAStartup( wVersionRequested, &wsaData );<br />if ( err != 0 )<br />{<br />return;<br />}</p><p>if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )<br />{<br />WSACleanup();<br />return;<br />}<br />//建立通訊端<br />SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);</p><p>SOCKADDR_IN addrSrv;<br />addrSrv.sin_addr.S_un.S_addr=INADDR_ANY;<br />addrSrv.sin_family=AF_INET;<br />addrSrv.sin_port=htons(6000);</p><p>//將通訊端綁定到一個本地地址和連接埠上<br />bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));</p><p>listen(sockSrv,5);</p><p>SOCKADDR_IN addrClient;<br />int len=sizeof(SOCKADDR);</p><p>while(1)<br />{<br />//將通訊端設為監聽模式,準備接收客戶請求,返回一個新的對應於此次串連的通訊端<br />SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);</p><p>//向用戶端發送資料<br />char sendBuf[100];<br />sprintf(sendBuf,"Welcome %s to http//zhe.com.cn",<br />inet_ntoa(addrClient.sin_addr));<br />send(sockConn,sendBuf,strlen(sendBuf)+1,0);</p><p>//接收客戶發送的資料<br />char recvBuf[100];<br />A *a, b;<br />char *buf;</p><p>buf = (char *)malloc(sizeof(struct A));<br />a = (struct A *)malloc(100);<br />a = (struct A *)malloc(sizeof(struct A));</p><p>//recv(sockConn,recvBuf,100,0);<br />//recv(sockConn,buf,100,0);</p><p>recv(sockConn,buf,sizeof(struct A),0);<br />memcpy(a, buf, sizeof(struct A));</p><p>printf("%d/n",a->i);<br />printf("%d/n",a->no);<br />printf("%s/n",a->buf);</p><p>memcpy(&b, buf, sizeof(struct A));</p><p>printf("%d/n",b.i);<br />printf("%d/n",b.no);<br />printf("%s/n",b.buf);</p><p>closesocket(sockConn);<br />}<br />}</p><p>//用戶端程式的編寫<br />//1、 建立通訊端(Socket)。<br />//2、 向伺服器發出串連請求(connect)。<br />//3、 和伺服器進行通訊(send/recv)。<br />//4、 關閉通訊端。<br />//<br />//如下是用戶端程式的源碼:</p><p>#include "winsock2.h"<br />#include "windows.h"<br />#include "stdio.h"<br />#include <string></p><p>#pragma comment(lib,"ws2_32.lib")</p><p>struct A<br />{<br />int i;<br />long no;<br />char buf[10];<br />};</p><p>void main()<br />{<br />//載入通訊端庫進行版本的協商<br />WORD wVersionRequested;<br />WSADATA wsaData;<br />int err;</p><p>A a, b;</p><p>wVersionRequested = MAKEWORD( 2, 2 );</p><p>err = WSAStartup( wVersionRequested, &wsaData );<br />if ( err != 0 )<br />{<br />return;<br />}</p><p>if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )<br />{<br />WSACleanup( );<br />return;<br />}</p><p>//建立通訊端<br />SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);</p><p>//串連服務端<br />SOCKADDR_IN addrSrv;<br />addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");<br />addrSrv.sin_family=AF_INET;<br />addrSrv.sin_port=htons(6000);<br />connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));</p><p>//接收資料<br />char recvBuf[100];</p><p>strcpy(a.buf, "client");<br />a.i = 1;<br />a.no = 99;</p><p>char *buf;</p><p>buf = (char *)malloc(sizeof(struct A));<br />memcpy(buf, &a, sizeof(a));</p><p>recv(sockClient, recvBuf, 100, 0);<br />printf("%s/n",recvBuf);<br />//用戶端發送資料<br />//send(sockClient, "我是你的娘啊!", strlen("我是你的娘啊!")+1, 0);<br />send(sockClient, buf, sizeof(struct A), 0);</p><p>closesocket(sockClient);</p><p>getchar();<br />}<br />