Windows Socket和Linux Socket編程的區別

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

1、一些常用函數的移植?

http://www.vckbase.com/document/viewdoc/?id=1586

2、網絡?

socket相關程序從Windows移植到Linux下需要注意的:

1)頭文件?

Windows下winsock.h/winsock2.h?
Linux下sys/socket.h?
錯誤處理:errno.h

2)初始化?

Windows下需要用WSAStartup?
Linux下不需要

3)關閉socket?

Windows下closesocket(...)?
Linux下close(...)

4)類型?

Windows下SOCKET?
Linux下int?
如我用到的一些宏:?

#ifdef WIN32?typedef int socklen_t;?typedef int ssize_t;?
#endif#ifdef __Linux__?typedef int SOCKET;?typedef unsigned char BYTE;?typedef unsigned long DWORD;?
#define FALSE 0?
#define SOCKET_ERROR (-1)?#endif

5)綁定地址的結構體

名稱相同,都是struct sockaddr、struct sockaddr_in,這兩者通常轉換使用;

在Windows下面名稱都是大寫,而在Linux下為小寫

常用:

Linux下:

sockaddr_in destAddr;destAdd.sin_family=AF_INET;
destAddr.sin_port=htons(2030);
destAddr.sin_addr.s_addr=inet_addr("192.168.1.1");

Windows下:

SOCKADDR_IN destAddr;
destAddr.sin_addr.S_un.S_addr=inet_addr("192.168.1.1");

但結構體中成員的名稱不同

Windows中結構體成員

struct sockaddr_in {short   sin_family;u_short sin_port;struct  in_addr sin_addr;char    sin_zero[8];
};
struct sockaddr {u_short    sa_family;char       sa_data[14];
};
struct in_addr {union {struct { u_char s_b1,s_b2,s_b3,s_b4; }   S_un_b;struct { u_short s_w1,s_w2; }            S_un_w;u_long                                   S_addr;} S_un;
};

下面的一些宏可以使windows下的程序移植到linux下(通過類型的重新定義,使代碼具有linux和windows下的移植性)

?

5)獲取錯誤碼?

Windows下getlasterror()/WSAGetLastError()?
Linux下errno變量

6)設置非阻塞?

Windows下ioctlsocket()?
Linux下fcntl() <fcntl.h>

7)send函數最后一個參數?

Windows下一般設置為0?
Linux下最好設置為MSG_NOSIGNAL,如果不設置,在發送出錯后有可 能會導致程序退出。

8)send函數最后一個參數?

windows下一般設置為0?
linux下最好設置為MSG_NOSIGNAL,如果不設置,在發送出錯后有可 能會導致程序退出。?

?

9)毫秒級時間獲取?

Windows下GetTickCount()?
Linux下gettimeofday()

10)數據類型的一些轉化

通用的:
小端到大端(網絡協議使用)的轉換:htonl, htons?
點分十進制IP和整數之間的相互轉換:inet_addr()(該函數將點分十進制轉為整數),inet_aton(),inet_ntoa(),inet_pton()(linux下獨有? 該函數可以實現相互之間的轉換)
使用到的頭文件不相同,linux下用man命令查詢。

另外注意:
linux下使用的套接字為伯克利套接字,因此在select()函數的使用上(第一個參數的設置)也有區別;

windows下為了與伯克利套接字匹配,第一個參數是無所謂,一般可設為0;

int maxfdp是一個整數值,是指集合中所有文件描述符的范圍,即所有文件描述符的最大值加1,不能錯!

?

?

3、多線程?

?

多線程: (win)process.h --〉(Linux)pthread.h?
_beginthread --> pthread_create?
_endthread --> pthread_exit

?

一、linux下的socket編程:

1、客戶端執行步驟依次如下:

socket()

connect()

send()或者recv()

close()

注意的是,connect之前要填充地址結構體,IP地址轉換為網絡字節序,一般用inet_aton().

2、服務器端:

socket()

bind()

listen()

accpet()

recv()或者send()

close()

(ps:一般通過將send()和recv()的最后一個參數賦為0或者1來區分阻塞與非阻塞,其中0對應阻塞,1對應非阻塞)

二、windows下的網絡編程:

做過windows網絡編程的人都知道,微軟的MFC把復雜的WinSock API函數封裝到類里,這使得編寫網絡應用程序更容易。即windows既提供上層的網絡API函數也提供底層的API函數。

1、對于采用上層的API函數而言:若采用csocket類定義一個對象obj的話,那么進行網絡編程的步驟如下:

客戶端:

obj.Create()

obj.Connect()

obj.Receive()或者obj.Send()

obj.Close()

服務器端:

先調用AfxSocketInit()檢測協議棧安裝情況

obj.Create()

obj.Listen()

obj.Accpet()

obj.Receive()或者obj.Send()

obj.Close()

2、對于采用底層的API函數而言,步驟如下:

客戶端:

WSAStartup()

socket()

connect()

send()或者recv()

closesocket()

服務器端:

WSAStartup()
socket()
bind()
listen()
accpet()
send()
recv()
closesocket()

(ps:windows下CSocket類為同步方式,有阻塞現象;CASyncSocket為異步方式,無阻塞現象。)

通過以上比較可以發現:linux下的網絡編程與windows下采用底層的API類似,但是也有區別:

區別一:windows下需加上WSAStartup()函數

區別二:關閉socket:linux為close(),windows為closesocket()

windows下采用上層的API,一般有CSocket和CAsynSocket這兩種類型的類

這種情況以下socket函數一般的首字母大寫。而底層的API不管是windows下的還是linux下的socket函數首字母都是小寫的。

?

socket編程在windows和linux下的區別

轉載于:https://my.oschina.net/mickelfeng/blog/1522729

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280725.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280725.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280725.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 C# 開發的現代輕量級 Windows 文本編輯器

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具和組件&#xff0c;希望對您有用&#xff01;Notepads 是一個具有簡約設計的現代化輕量級文本編輯器&#xff0c;在 github 上開源&#xff0c;由微軟大佬 Jiaqi Liu 開發。開發背…

分布式壓測系列之Jmeter4.0第一季

1&#xff09;Jmeter4.0介紹 jmeter是個純java編寫的開源壓測工具&#xff0c;apache旗下的開源軟件&#xff0c;一開始是設計為web測試的軟件&#xff0c;由于發展迅猛&#xff0c;現在可以壓測許多協議比如&#xff1a;http、https、soap、ftp、database數據庫、LDAP 輕量目…

powershell 查看系統設備\device status

查看設備 $allDevice"C:\Data\soundDevAll.txt" (Get-WmiObject -Class Win32_SoundDevice).Name|Out-File $allDevice device status $deviceInfoGet-WmiObject Win32_PnPEntity| select Name, Status | where {$_.Name -like "$deviceName"} $set…

Fish Shell 使用筆記

安裝Fish Shell brew install fish 安裝Oh My Fish curl -L https://get.oh-my.fish | fish 安裝Fisher curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish 配置 autojump clone autojump git clone https://github.com/wting/autojum…

Entity Framework Core 7中高效地進行批量數據插入

因為之前的版本中&#xff0c;EF Core無法實現高效地批量插入、修改、刪除數據&#xff0c;所以我開發了Zack.EFCore.Batch這個開源項目&#xff0c;比較受大家的歡迎&#xff0c;獲得了400多個star。從.NET 7開始&#xff0c;微軟在Entity Framework Core 7內置了對高效地批量…

Hive學習之路 (一)Hive初識

Hive 簡介 什么是Hive 1、Hive 由 Facebook 實現并開源 2、是基于 Hadoop 的一個數據倉庫工具 3、可以將結構化的數據映射為一張數據庫表 4、并提供 HQL(Hive SQL)查詢功能 5、底層數據是存儲在 HDFS 上 6、Hive的本質是將 SQL 語句轉換為 MapReduce 任務運行 7、使不熟悉 MapR…

angularJs select綁定的model 取不到值

內容結構 一.原因分析 二. 解決辦法 一.原因分析 1.由于原型繼承的關系&#xff0c;修改父級對象中的someBareValue會同時修改子對象中的值&#xff0c;但反之則不行。2.ng-if 以及 ng-repeat 會創建一個子級作用域&#xff0c;如果在這倆個指令中添加了元素&a…

PS2019攝影后期處理(三)通透....

一、PS可選顏色 在對應顏色進行cmyk加減

(原創) 今天拿到學生證了 (日記)

<原文我在2006/09/07發表在藍色小舖>今天拿到學生證了&#xff0c;終於正式成為臺大的學生。第一件事情就是去臺大圖書館借了四本書回家看&#xff0c;一次可以借兩個月耶&#xff0c;真不錯。 感覺很複雜&#xff0c;下星期要離開華碩&#xff0c;得繳回識別證&#xff…

os 鍵盤快捷鍵截圖_如何通過鍵盤快捷鍵更有效地使用OS X虛擬桌面

os 鍵盤快捷鍵截圖() We like having multiple virtual desktops on OS X, especially when we can supercharge them by combining them with a few simple keyboard shortcuts. So, on that note, here are some practical ways to use OS X’s virtual desktops like you me…

旗正規則引擎內存表出錯的原因及解決方法

經常我們有一些使用者問到這個問題&#xff0c;關于內存表出錯的情況&#xff0c;其實問題不復雜&#xff0c;我這給大家簡單的講一下就明白了&#xff0c;如果還有什么不明白的&#xff0c;其實也都可以問廠家杭州旗正&#xff0c;隨時都有人回應的。 1 內存表 1.1 匯總 1.1.1…

Shell腳本之sed的使用

1.sed命令&#xff1b;主要作用是查找&#xff1b;新增 刪除 和修改替換。 user.txt daokr#cat user.txt ID Name Sex Age 1 zhang M 19 2 wang G 20 3 cheng M 10 4 huahua M 100 查找命令&#xff1a;-n 和 p&#xff08;prin…

.NET周報【11月第4期 2022-11-30】

國內文章.NET 7 的 AOT 到底能不能扛反編譯&#xff1f;https://www.cnblogs.com/huangxincheng/p/16917197.html在 B 站&#xff0c;公眾號上發了一篇 AOT 的文章后&#xff0c;沒想到反響還是挺大的&#xff0c;都稱贊這個東西能抗反編譯&#xff0c;可以讓破解難度極大提高&…

結合hello world探討gcc編譯程序的過程

本博客&#xff08;http://blog.csdn.net/livelylittlefish&#xff09;貼出作者&#xff08;三二一小魚&#xff09;相關研究、學習內容所做的筆記&#xff0c;歡迎廣大朋友指正&#xff01; 結合"hello world"探討gcc編譯程序的過程 1. gcc簡介 gcc/g是GNU工程的C和…

Powershell 時間相關

1.時間相差秒數計算 $start Get-Date Get-HotFix $end Get-Date Write-Host -ForegroundColor Red (Total Runtime: ($end - $start).TotalSeconds)//若開始時間保存為字符串$startTime Get-Date -Format yyyyMMddTHH:mm:ss $startTime[datetime]::ParseExact("$sta…

java類中,成員變量賦值第一個進行,其次是靜態構造函數,再次是構造函數

如題是結論&#xff0c;如果有人問你Java類的成員初始化順序和初始化塊知識就這樣回答他。下面是代碼&#xff1a; package com.test;public class TestClass{// 成員變量賦值第一個執行private static int m11;private int m21;// 靜態構造函數第二個執行static{System.out.pr…

Unity的未來,是固守Mono,還是擁抱CoreCLR?

TLDR;Unity堅定的擁抱.NET標準生態&#xff0c;正全速向CoreCLR遷移。Mono vs CoreCLR對于一個C#的初學者&#xff0c;首先要了解的便是.NET和C#的關系。所以這里不再贅述。對于一個Unity的初學者&#xff0c;在使用C#編碼的過程中&#xff0c;一定會遇到一些C#新特性不能在項目…

hinton教授的本科生課程CSC321-機器學習中的神經網的筆記

最近一直在看仙守博友所記錄的筆記 Hinton的CSC321課程&#xff08;完結&#xff0c;待文字潤色&#xff09;&#xff1a; 1、lecture1-NN的簡介 2、lecture2-NN結構的主要類型的概述和感知機 3、lecture3-線性神經元和算法 4、lecture4-神經網絡在語言上的應用 5、lecture5-對…

ASP存儲過程參數數據類型

ASP調用存儲過程一般的方法&#xff1a; p.Append cmd.CreateParameter("參數名稱",類型,方向,大小) 參許參數值的類型的意義如下&#xff1a; 名稱值 整數值 功能 adDBTimeStamp 135 日期時間數據類型 adDecimal 14 十進制整數值 adDouble …

powershell 啟動線程與關閉線程

啟動線程 $ScreenCapture"C:\ResolutionTool\ScreenCapture.exe" Start-Process $ScreenCapture 關閉線程 Get-Process ScreenCapture| Stop-Process