1.先總結一些會用到的知識
中計算機都分配乙個位址,該位址是乙個
32位的數值表示;
客戶端和伺服器通訊的時候需要指定乙個
ip位址
和埠。
ip位址
一般是用「internet標準
點分表示法」
像a.b.c.d
一樣指定
的,每乙個字母代表乙個位元組的數字(
十進位制、八進位制
或十六進製制)從左到右分配了乙個無符號
長整數的4個
位元組。
unsigned long inet_addr(_in_ const char *cp) :把乙個點分
ip位址
轉換成乙個32位
的無符號長整數。
網路位元組序:tcp/ip協議中規定好的資料表示方法,順序採用big endian排序方式;
主機位元組序:主機表示資料的方法,不同的作業系統位元組序不同,有big endian,有的是little endian ;若是主機位元組序與網路位元組序不同,則需
要轉換成一致的位元組序;
轉換位元組序用到的函式:
網路位元組序——主機位元組序 主機位元組序——網路位元組序
ntohl htonl1)伺服器端程式wsantohl
wsahtonl
ntohs htons
wsantohs wsahtons
sockaddr_in結構: 用來指定ip位址
和服務埠資訊。
struct sockaddr_in
2.面向連線的
tcp協議程式設計
#include#include#include#pragma comment(lib,"ws2_32")//新增庫檔案using namespace std;
int main()
{ //1.建立套接字(socket)
word version =makeword(2,2);//先確定使用套接字的版本
wsadata wdata;
int erro =wsastartup(version,&wdata);//啟動套接字
if(erro!=0)
{ cout<<"套接字啟動失敗!"<
2.客戶端的程式
#include
#include
#pragma
comment(lib,"ws2_32")
using
namespace std;
int main()
//客戶端
//1.建立套接字
wsadata wsd;
wsd.wversion=makeword(2,2);//確定套接字的版本
int erro;
erro=wsastartup(wsd.wversion,&wsd);
if(erro!=0)
cout<<"套接字啟動失敗!"
cout<<"套接字版本錯誤!"
socket clientsocket = socket(af_inet,sock_stream,0);
sockaddr_in servadd;
servadd.sin_addr.s_un.s_addr=inet_addr("127.0.0.1");
servadd.sin_family=af_inet;
servadd.sin_port=htons(6000);
//2.向伺服器傳送連線請求(connect)
connect(clientsocket,(sockaddr*)&servadd,sizeof(sockaddr));//套接字,伺服器ip位址,位址結構體的長度
//3.與伺服器通訊(send/recv)
char sendbuf[100],recvbuf[100];
while(1)
sleep(10000);
recv(clientsocket,recvbuf,100,0);
cout<<"receive :"
closesocket(clientsocket);
// wsacleanup();
system("pause");
return 0;
以上是使用tcp協議的簡單程式設計,tcp是
面向連線的通訊,是流協議
,udp是
無連線通訊,
幾乎是基於訊息的
,因此在接收函式的呼叫必須提供乙個足夠大的緩衝
空間,如果緩衝區不夠大,接收呼叫會失敗,出現錯誤
wsaemsgsize
,緩衝區填滿,未接收完的資料會丟棄。
//udp伺服器
#include#include#pragma comment(lib,"ws2_32")
using namespace std;
int main()
{ //伺服器端
//1.建立套接字
dword wversion;
wversion =makeword(2,2);
wsadata wsa;
wsa.wversion=wversion;
int erro=0;
erro= wsastartup(wversion,&wsa);
if(erro!=0)
{ cout<<"套接字啟動失敗!"<
#include#include#pragma comment(lib,"ws2_32")
using namespace std;
int main()
{ //伺服器端
//1.建立套接字
dword wversion;
wversion =makeword(2,2);
wsadata wsa;
wsa.wversion=wversion;
int erro=0;
erro= wsastartup(wversion,&wsa);
if(erro!=0)
{ cout<<"套接字啟動失敗!"《總結。
windows網路程式設計
winsock是windows系統下利用socket套接字進行網路程式設計的相關函式,是windows下的網路程式設計介面。winsock在常見的windows平台上有兩個主要的版本,即winsock1和winsock2。編寫與winsock1相容的程式你需要引用標頭檔案winsock.h,如果編寫...
windows網路程式設計
include include include 要使用winsock api,就要包含ws2 32.lib這個庫 pragma comment lib,ws2 32.lib int main int argc,char ar 為埠號賦值 short port if port atoi ar 1 0 ...
Windows網路程式設計雜談
windows網路程式設計雜談 關於bind inaddr any 的具體含義是,繫結到0.0.0.0。此時,對所有的位址都將是有效的,如果系統考慮冗餘,採用多個網絡卡的話,那麼使用此種bind,將在所有網絡卡上進行繫結。在這種情況下,你可以收到傳送到所有有效位址上資料報。例如 sockaddr i...