開發環境- clion
本地安裝了vs2017,可以選擇使用vs自帶的c++編譯器,如下圖:
對於vc++
引入庫檔案
socket依賴winsocket.h、winsocket.lib和winsocket.dll
在cmakelists中:
#新增標頭檔案搜尋路徑
link_libraries(ws2_32 wsock32)
全部配置:
cmake_minimum_required(version 3.16)
project(demo2)
set(cmake_cxx_standard 14)
set(cmake_cxx_flags "$ -static")
#add_executable( )
#新增標頭檔案搜尋路徑
link_libraries(ws2_32 wsock32)
# 遍歷專案根目錄下所有的 .cpp 檔案
#file (glob_recurse files *.cpp)
#foreach (file $)
# string(regex replace ".+/(.+)\\..*" "\\1" exe $)
# add_executable ($ $ socketdemo/msg_client.cpp overr/overmain.cpp)
# message (\ \ \ \ --\ src/$.cpp\ will\ be\ compiled\ to\ bin/$)
#endforeach ()
add_executable(main main.cpp)
add_executable(client socketdemo/msg_client.cpp)
add_executable(server socketdemo/msg_server.cpp)
#鏈結gcc-g++靜態庫
#target_link_libraries(demo2 libgcc.a)
#target_link_libraries(demo2 libstdc++.a)
#鏈結網路庫(如需要)
#target_link_libraries(demo2 ws2_32)
#鏈結執行緒庫(必須放到最後)
#target_link_libraries(demo2 libpthread.a)
流式套接字程式設計
網路資料的傳輸是靠套接字實現的。套接字有三種型別:流式套接字(socket_stream)、資料報套接字(socket_dgram)和原始套接字(raw)。
流式套接字是面向連線的,提供雙向、有序、無重複且記錄無邊界的資料流服務。適用於處理大資料量,開銷大
伺服器端程式設計步驟
初始化階段呼叫函式wsastartup
初始化windows sockets dll,只有初始化成功後,才能呼叫其他windows api函式。
void wsastartup(
_in_ word wversionrequested, // 所使用的win socket版本
_out_ lpwsadata lpwsadata //儲存系統返回的winsocket資訊
);
建立socket
初始化動態鏈結後,在服務端建立乙個監聽socket
socket(
_in_ int af, // 目前提供pf_inet(af_inet)
_in_ int type, // socket type, e.g. socket_stream(tcp),socket_dgram(udp)
_in_ int protocol // 通訊協議,預設值0
);
所有的wsasocket函式都可以通過呼叫 wsagetlasterror()獲取上次錯誤繫結埠
bind(
_in_ socket s,
_in_reads_bytes_(namelen) const struct sockaddr far * name, // socket位址,ip
_in_ int namelen // name的長度
);
伺服器端程式:
#include #include #include #include #include using namespace std;
#define buf_size 1024
void initialization();
int main()
else
//設定套接字為監聽狀態
if (listen(s_server, somaxconn) < 0)
else
cout << "服務端正在監聽連線,請稍候...." << endl;
//接受連線請求
len = sizeof(sockaddr);
s_accept = accept(s_server, (sockaddr *) &accept_addr, &len);
if (s_accept == socket_error)
cout << "連線建立,準備接受資料" << endl;
//接收資料
while (1)
else
// cout << "請輸入回覆資訊:";
// cin >> send_buf;
send_len = send(s_accept, "ok..", 100, 0);
if (send_len < 0)
}//關閉套接字
closesocket(s_server);
closesocket(s_accept);
//釋放dll資源
wsacleanup();
return 0;
}void initialization()
else
//檢測版本號
if (lobyte(wsadata.wversion) != 2 || hibyte(wsadata.whighversion) != 2)
else
//填充服務端位址資訊
}
客戶端程式:
#include #include #include using namespace std;
void initialization2();
void client();
int main()
void client()
else
//傳送,接收資料
while (1)
recv_len = recv(s_server, recv_buf, 100, 0);
if (recv_len < 0)
else
}//關閉套接字
closesocket(s_server);
//釋放dll資源
wsacleanup();
}void initialization2()
else
//檢測版本號
if (lobyte(wsadata.wversion) != 2 || hibyte(wsadata.whighversion) != 2)
else
//填充服務端位址資訊
}
為了讓程式能夠順利移植到其他平台,需要靜態鏈結
參考set(cmake_cxx_flags "$ -static")
:必須
cmake_minimum_required(version 3.16)
project(demo3)
set(cmake_cxx_standard 11)
set(cmake_cxx_flags "$ -static")
add_executable(demo3 main.cpp)
#鏈結靜態庫
#target_link_libraries(demo3 libboost_*-mgw*-mt-s-*.a)
#鏈結gcc-g++靜態庫
target_link_libraries(demo3 libgcc.a)
target_link_libraries(demo3 libstdc++.a)
#鏈結網路庫(如需要)
target_link_libraries(demo3 ws2_32)
#鏈結執行緒庫(必須放到最後)
target_link_libraries(demo3 libpthread.a)
C 之Socket程式設計
using system using system.collections.generic using system.linq using system.text encoding類 using system.threading.tasks using system.net.sockets usin...
c 學習之Socket網路程式設計
我是新手以前沒寫過部落格 希望大家勿噴,在編寫socket的時候需要匯入system.net.socket命名空間。利用該類我們可以直接編寫socket的客戶端和服務的的程式了,這裡我們只講tpc協議下的socket程式設計。tcp socket連線的過程可以簡單的分為 服務端監聽 客戶端請求 建立...
Socket程式設計 C
下面是示例程式的簡單步驟說明 伺服器端 第一步 用指定的埠號和伺服器的ip建立乙個endpoint對像 第二步 建立乙個socket對像 第三步 用socket對像的bind 方法繫結endpoint 第四步 用socket對像的listen 方法開始監聽 第五步 接受到客戶端的連線,用socket...