socket編程怎么運(yùn)行(基于tcp的socket編程步驟)
夕逆IT
- 數(shù)據(jù)庫(kù)
- 2023-08-13
- 350

大家好,如果您還對(duì)socket編程怎么運(yùn)行不太了解,沒(méi)有關(guān)系,今天就由本站為大家分享socket編程怎么運(yùn)行的知識(shí),包括基于tcp的socket編程步驟的問(wèn)題都會(huì)給大家...
大家好,如果您還對(duì)socket編程怎么運(yùn)行不太了解,沒(méi)有關(guān)系,今天就由本站為大家分享socket編程怎么運(yùn)行的知識(shí),包括基于tcp的socket編程步驟的問(wèn)題都會(huì)給大家分析到,還望可以解決大家的問(wèn)題,下面我們就開(kāi)始吧!
ug120三通接口怎么編程
1、編程UG120三通接口需要了解該接口的具體協(xié)議和數(shù)據(jù)格式,然后根據(jù)相應(yīng)的編程語(yǔ)言,使用適當(dāng)?shù)木W(wǎng)絡(luò)編程庫(kù)進(jìn)行開(kāi)發(fā)。
2、需要使用Socket編程建立與UG120的連接,然后按照協(xié)議要求進(jìn)行數(shù)據(jù)的發(fā)送和接收,處理接收到的數(shù)據(jù),并根據(jù)業(yè)務(wù)邏輯進(jìn)行相應(yīng)的處理和回復(fù)。
3、編程時(shí)還需要考慮錯(cuò)誤處理、連接管理等方面的邏輯。
e52650v2雙路怎么設(shè)置
要設(shè)置e52650v2雙路,首先需要確保硬件連接正確。將兩個(gè)處理器插到主板上,確保它們正確連接上電源和散熱器。
接下來(lái),在主板的BIOS設(shè)置中,找到“Advanced”或“CPUConfiguration”選項(xiàng)。
在這個(gè)菜單中,找到“CPUSocketConfiguration”或類(lèi)似選項(xiàng),并將其打開(kāi)。
然后,選擇雙路模式,并確保“Enable”選項(xiàng)已選擇。
最后,保存設(shè)置并重新啟動(dòng)計(jì)算機(jī)。此時(shí),系統(tǒng)將自動(dòng)識(shí)別和激活雙路模式。請(qǐng)注意,確保你的操作系統(tǒng)和應(yīng)用程序都能夠支持雙路配置。
如何寫(xiě)一個(gè)web程序和服務(wù)器端的一個(gè)exe程序進(jìn)行通信
1.exe間隔一段時(shí)間就去爬取web某個(gè)url來(lái)獲取web上的信息,然后入庫(kù)。
2.web上的某個(gè)url可以用ajax方式,間隔一段時(shí)間就去獲取下數(shù)據(jù)庫(kù)的信息。
以數(shù)據(jù)庫(kù)為媒介,達(dá)到exe和web的通訊!
error reading socket是什么意思,怎么解決
1、虛擬內(nèi)存太小或者C盤(pán)滿了。
如果是這種,請(qǐng)自己查資料加大虛擬內(nèi)存量,并保證C盤(pán)還有充足的空間。
2、是你電腦里面某個(gè)軟件的問(wèn)題。
這個(gè)錯(cuò)誤可能是你計(jì)算機(jī)的Socket句柄資源用盡導(dǎo)致的,能夠造成這種現(xiàn)象的一種情況就是你的計(jì)算機(jī)的某個(gè)程序不斷的向某個(gè)連接發(fā)出連接申請(qǐng),但是始終沒(méi)能連上,沒(méi)連上就會(huì)引發(fā)一個(gè)錯(cuò)誤,如果編程的人沒(méi)有寫(xiě)釋放資源的代碼,那么這個(gè)連接就始終占據(jù)著著一個(gè)句柄,于是由于不斷的連接,最終導(dǎo)致Socket句柄資源耗盡。
如果你運(yùn)行的都是很正常的程序,那么很可能進(jìn)行連接的就是一些木馬程序,比如盜取密碼的程序需要將盜取的密碼發(fā)送到某臺(tái)機(jī)器上等等。
如果殺毒沒(méi)殺到,就裝個(gè)防火墻看看,追求干脆的話就重新安裝系統(tǒng)。
3、注冊(cè)表中的以下二項(xiàng)出現(xiàn)錯(cuò)誤HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinsockHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock2解決法:備份,然后找一臺(tái)相同系統(tǒng)的機(jī)器,將以下注冊(cè)表分支導(dǎo)出存為二個(gè)文件,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinsockHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock2最后將這二個(gè)導(dǎo)出的注冊(cè)表文件導(dǎo)入到有問(wèn)題的機(jī)器中即可。以上~
openssl如何使用
以Nginx對(duì)OpenSSL的使用為入口,來(lái)分析OpenSSL的API的模型。OpenSSL是兩個(gè)庫(kù),如果以握手為目的只會(huì)使用libssl.so這個(gè)庫(kù),但是如果有加密的需求,會(huì)使用libcrypto.so這個(gè)庫(kù)。Nginx中對(duì)于OpenSSL的使用大部分是直接使用的libssl.so的接口API的,但是仍然會(huì)有少部分使用libcrypto.so。除了Nginx,本章還會(huì)分析一個(gè)s_server程序,通過(guò)這個(gè)程序的設(shè)計(jì),能夠?qū)penSSL的內(nèi)部架構(gòu)有一個(gè)初探。
Nginx的Stream中SSL的實(shí)現(xiàn)
Nginx的StreamProxy中有對(duì)于SSL的Terminator的支持。這個(gè)終端的意思是可以在Nginx層面把SSL解掉,然后把明文傳輸給后端。也就是說(shuō)支持SSL的Nginx的Stream模塊實(shí)際上是一個(gè)TLS的握手代理,將TLS信道在本地解了再發(fā)送到后端,所以整個(gè)過(guò)程是一個(gè)純粹的握手過(guò)程,至于ALPN這種功能就需要后端與TLS的配合才可以,所以這種行為在stream的SSL中是不能支持的。
這是一個(gè)Nginx的StreamSSL模塊相關(guān)的函數(shù)列表,主要的Stream模塊特有的功能也都就在這個(gè)列表里了。可以看到除去配置和模塊的整體初始化函數(shù),只剩下一個(gè)連接初始化,ssl的入口handler和握手的handler。顯然握手的handler是入口handler的深入部分。鑒于Nginx的異步模型,可以很容易的想到是Nginx在收到一個(gè)連接的時(shí)候首先使用ssl_handler作為通用入口,在確定是SSL連接之后就會(huì)切換到handshaker_handler作為后續(xù)的握手handler函數(shù)。
但是Nginx在支持SSL的時(shí)候并不是這樣的輕松,因?yàn)榇罅康腟SL相關(guān)函數(shù)在ngx_event_openssl.c文件里,這個(gè)文件里的函數(shù)被HTTP模塊和Stream模塊或者其他需要SSL支持的模塊共同使用。包括SessionCache等Nginx重新實(shí)現(xiàn)的OpenSSL功能。通過(guò)這個(gè)例子可以看到如果要自己實(shí)現(xiàn)一個(gè)SSL支持,我們需要兩個(gè)東西,一個(gè)是SSL的用戶端的接口封裝庫(kù)(ngx_event_openssl.c),一個(gè)是如何把封裝庫(kù)的邏輯嵌入到我們的代碼流程的邏輯。Nginx作為一個(gè)強(qiáng)大的負(fù)載均衡設(shè)備,這一部分的接口嵌入應(yīng)該是要追求的最小化實(shí)現(xiàn)的。也就是說(shuō)Stream模塊相關(guān)的代碼越少越好(ngx_stream_ssl_module.c)。所以我們可以看到幾乎就幾個(gè)鉤子函數(shù)的定義。
無(wú)論是Stream還是HTTP模式,整個(gè)TLS握手的核心函數(shù)都是ngx_ssl_handshake函數(shù)。我們看這個(gè)函數(shù)就能看到一個(gè)企業(yè)級(jí)的握手接口的使用案例。以下是一個(gè)簡(jiǎn)化版的函數(shù)流程:
以上是一個(gè)同步版本的大體邏輯,異步版本的就沒(méi)有顯示。可以看到主要的SSL握手的入口函數(shù)是SSL_do_handshake。如果握手正常,函數(shù)返回1之后,使用SSL_get_current_cipher或得到服務(wù)器根據(jù)客戶端發(fā)來(lái)的密碼學(xué)參數(shù)的列表選擇得到的密碼學(xué)套件。這里會(huì)返回服務(wù)器選擇的那個(gè),如果返回為空,那么就代表了服務(wù)器沒(méi)有找到匹配的套件,連接就不能繼續(xù)。SSL_CIPHER_description函數(shù)輸入活的指針,返回一個(gè)字符串格式的套件的描述信息,Nginx這里使用了這個(gè)信息,最后一步就是查找當(dāng)前的SessionCache中是否有可以復(fù)用的邏輯。這里只是一個(gè)查詢,并不是就是復(fù)用的決定。因?yàn)槭欠駨?fù)用是在連接建立之前由配置決定的,如果Nginx配置了不使用OpenSSL的SessionCache,這個(gè)查詢就會(huì)一直返回0,表示沒(méi)有被復(fù)用。而且這里查詢的OpenSSL中是否有復(fù)用,并不代表Nginx內(nèi)部是否有復(fù)用,Nginx內(nèi)部還有一套自己的SessionCache實(shí)現(xiàn),但是使用SSL_開(kāi)頭的API函數(shù)都是OpenSSL的接口。
這個(gè)簡(jiǎn)單的接口可以看出對(duì)OpenSSL的API的使用的一些端倪。OpenSSL提供的API非常多,我們寫(xiě)一個(gè)簡(jiǎn)單的示例程序僅僅會(huì)用到幾個(gè)最簡(jiǎn)單的接口,例如SSL_new等。但是一個(gè)正式的項(xiàng)目,會(huì)用到很多細(xì)節(jié)的API接口。由于OpenSSL只會(huì)暴露他認(rèn)為應(yīng)該暴露的API函數(shù)出來(lái)給調(diào)用者使用,其他的函數(shù)調(diào)用者是用不到的,并且OpenSSL內(nèi)部的結(jié)構(gòu)體外部也是不能使用的,所以使用者所有的行為都是要基于API進(jìn)行設(shè)計(jì)。
OpenSSL分為libcrypto.so和libssl.so兩個(gè)庫(kù)。在使用TLS握手的時(shí)候,主要的調(diào)用API都位于ssl.h文件中定義,都是SSL_開(kāi)頭的API。但是這并不意味著只能調(diào)用libssl.so的接口,高級(jí)的用戶并不是想要使用OpenSSL的TLS握手功能,完全可以直接調(diào)用libcrypto.so里面的各種各樣的密碼學(xué)庫(kù)。總的來(lái)說(shuō)libssl.so是一個(gè)TLS握手庫(kù),而libcrypto.so是一個(gè)通用的密碼學(xué)的庫(kù)。只是libssl.so的握手使用的密碼學(xué)是完全依賴(lài)libcryto.so中提供的。也就是因此,在使用TLS握手的時(shí)候,是基本上不會(huì)直接用到libcrypto.so中的API的。
s_server
openssls_server是一個(gè)簡(jiǎn)單的SSL服務(wù)器,雖然說(shuō)是簡(jiǎn)單,但是其中包含了大部分用戶SSL編程需要考慮的東西。證書(shū),密碼,過(guò)期校驗(yàn),密碼學(xué)參數(shù)定制,隨機(jī)數(shù)定制等等。這是一個(gè)功能性的程序,用于驗(yàn)證openssl內(nèi)部的各項(xiàng)SSL握手服務(wù)器的功能是否能夠正常使用,并不能用于直接服務(wù)于線上業(yè)務(wù)。
s_server程序啟動(dòng)的第一步是解析各種參數(shù),在正常運(yùn)作的時(shí)候,第一步是加載key。
我們看到OpenSSL內(nèi)部調(diào)用的函數(shù)和在使用OpenSSL庫(kù)接口的時(shí)候是不一樣的,OpenSSL的子程序會(huì)調(diào)用一些內(nèi)部的接口。比如這里使用了ENGINE_init,直接初始化了底層的引擎系統(tǒng)。ENGINE系統(tǒng)是OpenSSL為了適配下層不同的數(shù)據(jù)引擎設(shè)計(jì)的封裝層。有對(duì)應(yīng)的一系列API,所有的ENGINE子系統(tǒng)的API都是ENGINE_開(kāi)頭的。一個(gè)引擎代表了一種數(shù)據(jù)計(jì)算方式,比如內(nèi)核的密碼學(xué)套件可以有一個(gè)專(zhuān)門(mén)的OpenSSL引擎調(diào)用到內(nèi)核的密碼學(xué)代碼,QAT硬件加速卡也會(huì)有一個(gè)專(zhuān)門(mén)的引擎,OpenSSL自己的例如RSA等加密算法的實(shí)現(xiàn)本身也是一個(gè)引擎。這里在加載key的時(shí)候直接初始化一個(gè)引擎,這個(gè)引擎在init之前還要先調(diào)用一個(gè)setup_engine函數(shù),這個(gè)函數(shù)能夠設(shè)置這個(gè)將要被初始化的引擎的樣子。s_server之所以要自己用引擎的API接口是因?yàn)樗С謴拿钚休斎胍娴膮?shù),指定使用的引擎。
可以看到,如果指定了auto,就會(huì)加載所有默認(rèn)的引擎。如果指定了特定ID的引擎,就只會(huì)加載特定的引擎。一個(gè)引擎下面是所有相關(guān)的密碼學(xué)的實(shí)現(xiàn),加載key就是一個(gè)密碼學(xué)層面的操作,所以也要使用ENGINE提供的接口。事實(shí)上,最后都是分別調(diào)用了對(duì)應(yīng)的ENGINE的具體實(shí)現(xiàn),這中間都是通過(guò)方法表的指針的方式完成的。ENGINE定義的通用的接口還有很多,這里只是用到了加載密鑰。
表內(nèi)都是對(duì)不同的EVP_CIPHER和EVP_MD的接口的定義。
我們回到加載key的函數(shù),繼續(xù)閱讀發(fā)現(xiàn)一個(gè)key=bio_open_default(file,'r',format);這個(gè)key是一個(gè)BIO類(lèi)型的指針,這個(gè)BIO類(lèi)型的指針就是另外一個(gè)OpenSSL的子系統(tǒng),所有的IO操作都會(huì)被封裝到這個(gè)子系統(tǒng)之下。例如這里使用的文件IO,用于從文件中讀取key的結(jié)果。BIO被設(shè)計(jì)為一個(gè)管道式的系統(tǒng),類(lèi)似于Shell腳本中見(jiàn)到的管道的效果。有兩種類(lèi)型的BIO,一種是source/sink類(lèi)型的,就是我們最常見(jiàn)的讀取文件或者Socket的方式。另外一種是管道BIO,就是兩個(gè)BIO可以通過(guò)一個(gè)管道BIO連接起來(lái),形成一個(gè)數(shù)據(jù)流。所以BIO的方式是一個(gè)很重量級(jí)的IO系統(tǒng)的實(shí)現(xiàn),只是目前只是被OpenSSL內(nèi)部使用的比較多。
繼續(xù)向下閱讀加載密鑰的函數(shù),會(huì)發(fā)現(xiàn)PEM_read_bio_PrivateKey函數(shù),這一步就是實(shí)際的從一個(gè)文件中讀取密鑰了。我們現(xiàn)在已經(jīng)有了代表文件讀寫(xiě)的BIO,代表密碼學(xué)在程序中的封裝EVP,中間缺的橋梁就是文件中密鑰存儲(chǔ)的格式。這里的以PEM_開(kāi)頭的函數(shù)就代表了PEM格式的API。PEM是密碼學(xué)的存儲(chǔ)格式,PEM_開(kāi)頭的API就是解析或者生成這種格式的API,當(dāng)然它需要從文件中讀取,所以參數(shù)中也會(huì)有BIO的結(jié)構(gòu)體,PEM模塊使用BIO模塊提供的文件服務(wù)按照定義的格式將密鑰加載到內(nèi)存。
OpenSSL的所有apps都會(huì)共享一些函數(shù),這些函數(shù)的實(shí)現(xiàn)都在一個(gè)apps.c文件中,以上的加載密鑰的函數(shù)也是其中的一個(gè)。s_server程序在調(diào)用完load_key之后會(huì)繼續(xù)調(diào)用load_cert來(lái)加載證書(shū)。load_cert使用的子系統(tǒng)與load_key非常類(lèi)似,類(lèi)似的還有后面的load_crl函數(shù),CRL(Certificaterevocationlists)是CA吊銷(xiāo)的證書(shū)列表,這項(xiàng)技術(shù)已經(jīng)基本被OCSP淘汰。OpenSSL還提供一個(gè)隨機(jī)數(shù)文件的功能,可以從文件中加載隨機(jī)數(shù)。
s_server在加載完相關(guān)的密碼學(xué)相關(guān)參數(shù)后,就會(huì)開(kāi)始創(chuàng)建上下文,SSL_CTX_new函數(shù)的調(diào)用就代表了上下文的創(chuàng)建。這個(gè)上下文是后面所有SSL連接的母板,對(duì)SSL的配置設(shè)置都會(huì)體現(xiàn)在這個(gè)上下文的設(shè)置中。隨后,s_server會(huì)開(kāi)始設(shè)置OpenSSL服務(wù)器支持的TLS握手版本范圍,分別調(diào)用SSL_CTX_set_min_proto_version和SSL_CTX_set_max_proto_version兩個(gè)函數(shù)完成所有操作。
OpenSSL在共享TLS握手的Session時(shí),需要生成一個(gè)SessionID,默認(rèn)的情況,OpenSSL會(huì)在內(nèi)部決定SessionID怎么生成。但是也提供了用戶設(shè)置這個(gè)生成算法的API。s_server程序調(diào)用SSL_CTX_set_generate_session_id函數(shù)設(shè)置一個(gè)自己的回調(diào)函數(shù),在這個(gè)回調(diào)函數(shù)中就可以完成SessionID的設(shè)置,從而取代掉OpenSSL自帶的內(nèi)部SessionID的生成器。OpenSSL在證書(shū)協(xié)商的時(shí)候還會(huì)允許外部的庫(kù)使用者動(dòng)態(tài)的修改采用的證書(shū),這個(gè)機(jī)制是通過(guò)SSL_CTX_set_cert_cb來(lái)設(shè)置證書(shū)回調(diào)函數(shù)實(shí)現(xiàn)的。s_server也有這個(gè)函數(shù)的設(shè)置。程序走到這里,基本能看到OpenSSL的一個(gè)很大的特性,就是大部分的內(nèi)部流程都會(huì)提供一個(gè)回調(diào)函數(shù)給使用者來(lái)注冊(cè),使用者可以按照自己的需求取代掉或者修改OpenSSL內(nèi)部的功能。顯然這個(gè)s_server程序是一個(gè)功能展示的程序,會(huì)用上大量的函數(shù)回調(diào)點(diǎn)。比如緊接著調(diào)用的SSL_CTX_set_info_callback函數(shù)就是在生成SSL的時(shí)候調(diào)用的,可以用于使用者獲得狀態(tài)。不但OpenSSL外部的機(jī)制可以在用戶端設(shè)置,用戶甚至可以設(shè)置加密算法的參數(shù)。例如s_server就會(huì)接下來(lái)根據(jù)用戶是否提供DH參數(shù)來(lái)設(shè)置內(nèi)部的參數(shù)。如果調(diào)用了SSL_CTX_set_dh_auto就意味著參數(shù)是使用內(nèi)部的機(jī)制生成,這也是默認(rèn)的行為。但是仍然可以提前提供,主要是為了性能的考慮,比如提前提供DH的大素?cái)?shù),DH算法在運(yùn)算的過(guò)程中需要一個(gè)取模操作,這個(gè)取模是對(duì)一個(gè)大素?cái)?shù)進(jìn)行取模的,而這個(gè)大素?cái)?shù)默認(rèn)是在運(yùn)行的時(shí)候動(dòng)態(tài)生成的,但是我們可以提供這個(gè)素?cái)?shù),從而以犧牲一定的安全性為代價(jià)換來(lái)性能的提高。
s_server在設(shè)置完整個(gè)上下文之后,就會(huì)進(jìn)入Socket監(jiān)聽(tīng)和處理的模式。由于BIO框架包含了Socket的能力,所以這一步本質(zhì)上就是調(diào)用BIO的接口。
這是一個(gè)典型的OpenSSL的Socket邏輯。BIO_sock_init這個(gè)函數(shù)在Linux下就是空函數(shù),沒(méi)有意義。BIO_lookup是一個(gè)通用的獲取地址的方法,對(duì)于Socket就是IP:PORT的字符串,對(duì)于文件是文件的目錄。BIO_socket意思就相當(dāng)于在使用Socket變成的socket函數(shù)。BIO_listen也就自然對(duì)應(yīng)listen函數(shù),BIO_accept_ex和BIO_closesocket也是類(lèi)似的意思。整個(gè)流程其實(shí)就與一個(gè)普通的Socket流程沒(méi)有太大區(qū)別,只是BIO多了一層封裝。因?yàn)镺penSSL是個(gè)跨平臺(tái)的庫(kù),這層封裝更多的意義在于用在跨平臺(tái)的應(yīng)用上的。
通過(guò)一個(gè)簡(jiǎn)單的s_server程序的分析可以看到整個(gè)OpenSSL的主要設(shè)計(jì)思路。它對(duì)外封裝了不同的模塊,例如ENGINE,EVP,BIO之類(lèi)的封裝。在大部分的流程上都提供了回調(diào)函數(shù)API,使用者可以用回調(diào)函數(shù)來(lái)修改OpenSSL原來(lái)的邏輯或者獲得其他的信息。在使用OpenSSL的時(shí)候一般需要遵循類(lèi)似的流程,就是創(chuàng)建上下文,然后配置上下文,然后運(yùn)行服務(wù)。
cs怎么聯(lián)網(wǎng)對(duì)戰(zhàn)
您可以使用Steam平臺(tái)進(jìn)行CS的聯(lián)網(wǎng)對(duì)戰(zhàn)。您需要首先在Steam上購(gòu)買(mǎi)CS并下載游戲客戶端。然后打開(kāi)Steam客戶端并選擇“社區(qū)”選項(xiàng)卡。在這里,您可以加入各種服務(wù)器并與其他玩家進(jìn)行對(duì)戰(zhàn)。如果您沒(méi)有Steam賬號(hào),請(qǐng)先注冊(cè)一個(gè)。
好了,文章到這里就結(jié)束啦,如果本次分享的socket編程怎么運(yùn)行和基于tcp的socket編程步驟問(wèn)題對(duì)您有所幫助,還望關(guān)注下本站哦!
本文鏈接:http://xinin56.com/su/965.html