windows 下的網絡編程

用簡單的代碼和演示說明了WinSocket的使用一般必要步驟。

先看看程序執行的效果吧:

一個簡單的Winsocket <wbr>UDP程序

最上面的一個窗口爲服務端,下面的窗口爲客戶端,服務端的主循環負責接收數據。如果客戶端輸出“exit”字符串的話,則服務端和客戶端程序終止。這個示例主要是通過簡單的代碼讓初學者瞭解到WSA(WinSocketAPI)的啓動相關的函數和參數,以及收發相關的兩個函數的使用,最後釋放WS資源。可以理解爲一個最小的C/S演示。

以下爲兩個程序的源代碼,在VS2005下編譯通過。

服務端:

//ServerMain.cpp

#include <stdio.h>
#include <WinSock2.h>//winsocket2 的頭文件
#include <iostream>

#pragma comment(lib, "WS2_32.lib")//winsocket2需要的庫文件

using namespace std;

int main()
{
//第一步:初始化網絡
WSADATA wsaData;
WORD wVersion = MAKEWORD(2,2);

WSAStartup(wVersion, &wsaData);

//第二步:建立一個socket
SOCKET sServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

//第三步:填充sockaddr_in結構
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(16568);
sin.sin_addr.S_un.S_addr = INADDR_ANY;

//第四步:綁定這個套接字到一個本地地址
if ( ::bind( sServer, (LPSOCKADDR)&sin, sizeof(sin) ) == SOCKET_ERROR )
{
return 0;
}

//第五步:接收數據
char szBuf[1024];
sockaddr_in addr;
int nLen = sizeof(addr);
while (true)
{
int nRecv = recvfrom(sServer, szBuf, 1024, 0, (sockaddr*)&addr, &nLen);
if ( nRecv > 0 )
{
szBuf[nRecv] = '\0';
cout << "接收到數據:" << szBuf << endl;
if ( strcmp(szBuf, "exit") == 0 )
{
break;
}
}
}

//第六步:關閉socket,釋放網絡
closesocket(sServer);
WSACleanup();
return 0;
}

客戶端:

//ClientMain.cpp

#include <stdio.h>
#include <WinSock2.h>
#include <iostream>

#pragma comment(lib, "WS2_32.lib")

using namespace std;

int main()
{
//初始化網絡
WSADATA wsaData;
WORD wVersion = MAKEWORD(2,2);

WSAStartup(wVersion, &wsaData);

//建立一個socket
SOCKET sClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

//填充sockaddr_in結構
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.S_un.S_addr = INADDR_ANY;
sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sin.sin_port = ntohs(16568);

//發送數據
char szBuf[256];
while ( true )
{
cin >> szBuf;
::sendto( sClient, szBuf, strlen(szBuf), 0, (sockaddr*)&sin, sizeof(sin) );
if(strcmp(szBuf, "exit") == 0 )
{
break;
}
}

//關閉socket
closesocket(sClient);
WSACleanup();
return 0;

}

就這麼簡單,一個簡化的網絡程序就寫出來了。當然要完成完備的網絡通信軟件或者其他網絡應用軟件要比這個複雜,但是這也是通向複雜的開始。很多朋友接觸網絡編程的時候,感到很痛苦,因爲可能一開始看得程序示例實現的功能比較全面,代碼量一大反而可能不便於理解,這也是很多人一開始在學網絡編程時畏懼網絡編程的原因吧。

這裏面涉及到的WSA(Win Socket API)函數就是如下幾個:

WSAStartup()

socket()

bind()

recvfrom()

sendto()

closesocket()

WSACleanup()

htons()(與其同類的功能還有htonl、ntohs、ntohl都是網絡字節順序和主機字節順序相互轉換的函數)

然後是幾個結構體。

這樣我們在學起來的時候就清晰了。只要搞清楚上面列舉的幾個函數和其參數的使用,我們網絡編程的入門第一步就算是完成了。希望我這貼給和我一樣的新手一個啓發。

我的建議是大家先寫一遍代碼,在寫的過程中加深印象,然後在看MSDN或相關書籍詳細的將每個WSA提供的那幾個函數的說明看一遍,我的方法就是先實際操作一遍,在來看他的原理。這樣最容易學習了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章