C 之socket程式設計

2022-02-22 17:08:14 字數 4548 閱讀 3789

開發環境- 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...