跨平台 Windows Linux 網路程式設計

2021-08-20 02:30:43 字數 2808 閱讀 9423

一、網路程式設計在windows下和linux下的區別

專案windows

linux

主要標頭檔案

winsock.h/winsock2.h

sys/socket.h fcntl.h  errno.h等

鏈結庫ws2_32.dll/lib

連線是使用引數:-lstdc

執行時需要libstdc++.so.5,可在/usr/lib目錄中建立乙個鏈結。

初始化及退出

初始化需要呼叫wsastartup,退出需呼叫wsacleanup

無關閉socket

closesocket()

close()

socket型別

socket

int錯誤檢視

wsagetlasterror

全域性變數errno

設定非阻塞模式

int i=1

ioctlsocket(sockethandle,fionbio,&i)   

fcntl(ockethandle,f_setfl, o_nonblock)

send/recv函式最後乙個引數

一般設定為0

可以有多種組合:msg_nosignal,msg_dontwait,msg_waitall

send的異常

當連線斷開,還發資料的時候,不僅send()的返回值會有反映,而且還會像系統傳送乙個異常訊息,如果不作處理,程式會退 出。為此,send()函式的最後乙個引數可以設定msg_nosignal,禁止send()函式向系統傳送異常訊息。

wsa巨集

除了可以使用標準的socket函式外,微軟自己有許多以wsa開始的函式,作為對標準socket函式的封裝(可能微軟感覺這些函式更好用一些吧)

二、對於recv和recvfrom的超時處理,linux下可以使用訊號機制,通用的處理可以使用setsockopt()設定超時引數:

//設定傳送超時

setsockopt(socket,sol_socket,so_sndtimeo,(char *)&timeout,sizeof(timeout));

//設定接收超時

setsockopt(socket,sol_socket,so_rcvtimeo,(char *)&nnettimeout,sizeof(timeout));

這裡需要注意的是,在windows和類unix下timeout的型別分別為int和struct timevval

三、對於多執行緒的處理

網路程式設計避不開多執行緒問題,類unix下我傾向於使用select和epoll。windows服務端我暫時沒有接觸,所以不知道。

epoll的介面非常簡單,一共就三個函式:

1、int epoll_create(int size);

建立乙個epoll的控制代碼,size用來告訴核心這個監聽的數目一共有多大。這個引數不同於select()中的第乙個引數,給出最大監聽的fd+1的值。需要注意的是,當建立好epoll控制代碼後,它就是會占用乙個fd值,在linux下如果檢視/proc/程序id/fd/,是能夠看到這個fd的,所以在使用完epoll後,必須呼叫close()關閉,否則可能導致fd被耗盡。

2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

epoll的事件註冊函式,它不同與select()是在監聽事件時告訴核心要監聽什麼型別的事件,而是在這裡先註冊要監聽的事件型別。第乙個引數是epoll_create()的返回值,第二個引數表示動作,用三個巨集來表示:

epoll_ctl_add:註冊新的fd到epfd中;

epoll_ctl_mod:修改已經註冊的fd的監聽事件;

epoll_ctl_del:從epfd中刪除乙個fd;

第三個引數是需要監聽的fd,第四個引數是告訴核心需要監聽什麼事,struct epoll_event結構如下:

typedef union epoll_data epoll_data_t;

struct epoll_event ;

events可以是以下幾個巨集的集合:

epollin :表示對應的檔案描述符可以讀(包括對端socket正常關閉);

epollout:表示對應的檔案描述符可以寫;

epollpri:表示對應的檔案描述符有緊急的資料可讀(這裡應該表示有帶外資料到來);

epollerr:表示對應的檔案描述符發生錯誤;

epollhup:表示對應的檔案描述符被結束通話;

epollet: 將epoll設為邊緣觸發(edge triggered)模式,這是相對於水平觸發(level triggered)來說的。

epolloneshot:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到epoll佇列裡

3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

等待事件的產生,類似於select()呼叫。引數events用來從核心得到事件的集合,maxevents告之核心這個events有多大,這個 maxevents的值不能大於建立epoll_create()時的size,引數timeout是超時時間(毫秒,0會立即返回,-1將不確定,也有說法說是永久阻塞)。該函式返回需要處理的事件數目,如返回0表示已超時。

int epoll_create(int size);
四、寫在後面

在以此為基礎上我想編寫乙個跨平台c/c++網路程式設計庫,目前已經完成了一部分工作,此篇部落格會持續更新

跨平台相關

二者區別 strdup是posix,strdup是windows特定。在unix上,使用的strdup。在不同作業系統的lib庫名字不同的,為了讓程式可以多平台,需要在巨集定義中判斷當前執行作業系統和編譯器的型別,動態調整。windows win32 win32 linux linux linux ...

跨平台工具

作圖 做好圖 inkspace 向量圖 inpaint 提供類似 photoshop 的基礎功能,簡單易用 imagemagick pdf 處理 1.small pdf 2.i love pdf 編輯器1.sublime text 2.typora markdown 3.texmaker latex...

討論 關於跨平台

跨平台是軟體的乙個重要指標。一般程式可分為平台無關和平台相關兩部分,平台相關部分主要涉及外圍裝置 如串列埠 鍵盤 滑鼠 lcd等 和作業系統api 如定時器 互斥鎖 檔案系統操作 執行緒操作等 除了程式本身的跨平台需求外,還有種應用是對目標機的模擬,例如在pc上模擬一些嵌入式平台的應用,一來可以方便...