從事網路方面的開發有一段時間了,每天在各種瑣碎的事情中奔波,對我這種野路子出身的c++程式設計師,感覺總是欠缺點什麼。
終於,思量再三,準備結束這繁雜卻無法前進寸步的工作,也暫時給自己一些時間,梳理一下自己摸索網路開發的一些東西,從簡單到複雜,一步一步的高階。希望能讓自己更進一步,也希望能幫助一些和我當年一樣懵逼的同行們,堅持就是勝利!
下面來看乙個簡單的示例:
server.cpp
#include #includeusing
namespace
std;
#pragma comment(lib,"ws2_32.lib")
//初始化socket資源
intinitialization()
return1;
}int
main()
socket socksvr;
sockaddr_in addrsvr;
//收發快遞,要保證我們有乙個收件人
socksvr = socket(af_inet, sock_stream, 0
);
//收件人可以選擇接受哪個地區發來的快遞
addrsvr.sin_addr.s_un.s_addr =htonl(inaddr_any);
//收件人可以選擇接受哪種方式發來的快遞(udp/tcp)
addrsvr.sin_family =af_inet;
//收件人有乙個固定的房間(埠)收取快遞
addrsvr.sin_port = htons(6000
);
//將收件人的各種資訊告知快遞商
bind(socksvr, (sockaddr*)&addrsvr, sizeof
(sockaddr));
//快遞商留意收件人的快遞
listen(socksvr, 5
); std::cout
<< "
激動的等待遠方朋友的快遞...
"
(sockaddr);
char csendbuf[128] = ;
char crecvbuf[128] = ;
sockaddr_in addrclient;
//當有快遞到來,快遞商將包裹儲存於特定的位置
socket sockclient = accept(socksvr, (sockaddr*)&addrclient, &nlen);
//收件人從這個位置取到自己的包裹
int nrecvlen = recv(sockclient, crecvbuf, 128, 0
); cout
<< "
開心的取到了包裹:
"<< crecvbuf
);
//收件人根據寄件資訊,回覆
send(sockclient, csendbuf, strlen(csendbuf) + 1, 0
); closesocket(sockclient);
wsacleanup();
system(
"pause");
return0;
}
client.cpp
#include #includeusing
namespace
std;
#pragma comment(lib,"ws2_32.lib")
//初始化socket資源
intinitialization()
return1;
}int
main()
socket sockclient;
sockaddr_in addrsvr;
//收發快遞同樣需要乙個寄件人
sockclient = socket(af_inet, sock_stream, 0
);
//寄件人需要知道收件人的位址
addrsvr.sin_addr.s_un.s_addr = inet_addr("
127.0.0.1");
//寄件人需要知道收件人收取什麼郵寄方式的快遞
addrsvr.sin_family =af_inet;
//寄件人需要知道收件人在哪個房間收取快遞
addrsvr.sin_port = htons(6000
);
//快遞商通過寄件人給的資訊,檢查是否有誤
if (connect(sockclient, (sockaddr*)&addrsvr, sizeof(sockaddr)) ==socket_error)
char csendbuf[128] = "
hello!";
//將快遞根據收件人資訊傳送出去
send(sockclient, csendbuf, strlen(csendbuf) + 1, 0
);
char crecvbuf[128] = ;
recv(sockclient, crecvbuf,
128, 0
); cout
<< crecvbuf
"pause");
return0;
}
示例中,描述了socket網路程式設計基本的實現方式,從使用wsastartup選擇需要的socket版本,到socket的建立、位址和埠的選擇、協議的確定、接收和傳送函式等等。
後續的文章,將對此逐一進行詳細的講解。
網路程式設計(1) Socket收發
短連線 只進行一次收發就是短連線 長連線 傳送訊息後不關閉就是長連線,但會存在粘包等問題。接收 可以寫入乙個迴圈一直接收 trycatch exception e finally if outputstream null catch ioexception e catch exception e 沒...
c 網路程式設計(1)
一 epoll網路程式設計 select 和poll io多路復用模型 select的缺點 相比select模型,poll使用鍊錶儲存檔案描述符,因此沒有了監視檔案數量的限制,但其他三個缺點依然存在。在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有...
乙個demo學會c 程式設計
此demo主要包括三個檔案 namespace.h檔案,包含了自定義空間 空間函式 空間變數 空間自定義類 namespace.c檔案為namespace.h檔案中定義函式的實現 main.cpp檔案為主程式運算。namespace.h和namespace.cpp包含了自定義基 繼承類 模板類的定義...