socket編程怎么運行(基于tcp的socket編程步驟)

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