国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

socket網絡編程基礎

2019-11-06 05:26:51
字體:
來源:轉載
供稿:網友
一.socket編程函數1.socket函數原型:int socket(int domain, int type, int PRotocol);作用: 創建一個端點并返回一個socket描述符。參數解析:domain: 指定一個會話域名,選擇一個協議族用于這個會話。包含于<sys/socket.h>中。目前默認格式包括    AF_UNIX,AF_LOCAL  AF_INET  AF_INET6...type: 新套接口的類型描述。    SOCK_STREAM  SOCK_DGRAM  SOCK_SEQQPACKET...protocol: 通過domain和type已經基本確定了新建的socket具體是什么類型的套接字,最后一步通過protocol來確定socket到底支持的哪個協議(TCP?UDP?)。    為0,則可以理解為一個通配符也可以理解為一個默認值,就是說我不指定protocol,由內核自己決定使用哪一個protocol。返回值:成功返回socket描述,失敗返回-1.2.bind函數原型:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);作用:當通過socket創建一個描述符后,它就存在一個名字空間,但未給它分配地址空間。bind函數就是將addr地址分配給sockfd.參數解析:sockfd:未分配地址空間的socket描述符。addr:地址指針。      賦值:        sockaddr_in addr;        memset(&addr, 0, sizeof(addr));        addr.sin_family = AF_INET;        addr.sin_port = htons(m_nPort);        addr.sin_addr.s_addr = INADDR_ANY;    INADDR_ANY:表示當主機有多個ip時,客戶連接任意ip都可以。addrlen:地址長度。返回值:成功返回0,失敗返回-1.3.listen函數原型:int listen(int sockfd, int backlog);作用:處理客戶端三次握手過程。參數解析:sockfd:分配地址空間的socket描述符。backlog:backlog參數決定了未完成隊列和已完成隊列中連接數目之和的最大值。    內核為任何一個給定的監聽套接字維護兩個隊列。    1)未完成連接隊列      由客戶發出并到達服務器,而服務器正在等待完成相應的TCP三路握手的過程。      這些套接字處于SYN_RCVD狀態。        2)已完成連接隊列      每個已完成TCP三路握手過程的客戶對應其中一項。這些套接字處于ESTABLISHED狀態。    返回值:成功返回0,失敗返回-1.4.accept函數原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);作用:從bind的已完成連接隊列中獲取一個fd及地址信息。如果該隊列為空,則進程進入休眠(套接字為阻塞方式)。參數解析:sockfd:分配地址空間的socket描述符。addr:保存接收到客戶的地址信息。addrlen:客戶地址長度。返回值:成功返回客戶連接socket描述符,失敗返回-1。listen和accept過程參考文檔:http://blog.csdn.net/ordeder/article/details/215515675.connect函數原型:int connet(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);作用:用于TCP客戶來與服務器建立連接。    客戶端調用connect前并不需要非得調用bind函數,因為內核會根據源IP地址,選擇一個臨時端口作為源端口。    如果是TCP套接字,調用connect函數將會激發TCP的三路握手過程,而且僅在連接建立成功或出錯時才返回。參數解析:sockfd:分配地址空間的socket描述符。servaddr:指向套接字地址結構的指針,包含服務器IP和端口號。addrlen:套接字地址結構大小。返回值:成功返回0,錯誤返回-1.若失敗,需要重新創建套接字。6.recv函數原型:ssize_t recv(int sockfd, void *buf, size_t len, int flags);作用:將sockfd接收緩沖區的內容copy到buf中。    recv函數僅僅是copy數據,真正的接收數據是協議來完成的參數解析:sockfd:分配地址空間的socket描述符。buf:保存接收數據。len:從sockfd內核接收緩沖區中copy數據長度。flags:一般填0,設置模式。返回值:大于0表示接收數據字節長度,0表示對方斷開連接,-1表示失敗。7.send函數原型:ssize_t send(int sockfd, const void *buf, size_t len, int flags);作用:將buf中的內容copy到sockfd內核發送緩沖區中。    send函數僅僅是copy數據,真正的發送數據是協議來完成的參數解析:sockfd:分配地址空間的socket描述符。buf:保存發送數據。len:將buf數據copy到sockfd內核發送緩沖區中的長度。flags:一般填0,設置模式。返回值:返回發送的字節長度。-1表示失敗。send和recv函數處理過程參考文檔:http://www.cnblogs.com/jianqiang2010/archive/2010/08/20/1804598.html8.setsockopt函數9.getsockopt函數10.其他函數inet_pton, inet_ntop, getsockname, getpeername二.問題1.socket阻塞和非阻塞的區別(列全)  阻塞:當發出一個不能立即完成的套接字調用時,其進程進入休眠狀態,等待相應操作完成。  socket阻塞分為以下4類:  1)輸入操作:read、readv、recv、recvfrom、recvmsg    對于阻塞的TCP套接字,如果套接字的接收緩沖區中沒有數據可讀,該進程將被投入休眠,直到有數據到達。    對于非阻塞套接字,如果接收緩沖區中沒有數據可讀,相應的調用將立即返回一個EWOULDBLOCK錯誤。  2)輸出操作:write、writev、send、sendto、sendmsg    內核將從應用進程的緩沖區copy到該套接字的發送緩沖區。    對于阻塞套接字,如果其套接字發送緩沖區中沒有空間,進程將被投入睡眠,直到有空間為止。    對于非阻塞的TCP套接字,如果其發送緩沖區中根本沒有空間,輸出函數調用將立即返回一個EWOULDBLOCK錯誤。如果有發送緩沖區中有一些空間,    返回值將是內核能夠復制到該緩沖區中的字節數。  3)接收外來連接:accept    對于阻塞套接字調用accept函數,當無新連接到達,調用進程將被投入休眠。    對于非阻塞套接字調用accept函數,當無新連接到達,accept調用將立即返回一個EWOULDBLOCK錯誤。  4)發起外出連接:connect    對于阻塞套接字,連接不上則阻塞(linux阻塞75s),如果想不阻塞,則可以采用定時器信號的機制處理。    對非阻塞套接字,連接不上則立即返回,若為0,則表示已經建立連接;若為-1,如果error為EINPROGRESS,則使用select函數監測fd的連接狀態。  fcntl函數設置。參考文檔:http://blog.csdn.net/pingnanlee/article/details/7770087http://blog.csdn.net/nphyez/article/details/102687232.gdb調試coredump文件時,函數名為????問號  一些庫找不到(/lib/libstdc++.so.6),或者版本不匹配。3.sleep和阻塞等待的區別4.epoll模型詳細處理過程5.nginx詳解6.三次握手與四次揮手的過程。  三次握手:    1)客戶端發送SYN包到服務器,并進入SYN_SEND狀態,等待服務器確認。    2)服務器收到SYN包,并確認。同時自己發送一個SYN包,及ACK+SYN,服務器進入SYN_RECV狀態。    3)客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ACK=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。    完成三次握手,客戶端與服務器開始傳送數據。  四次揮手:    TCP是全雙工通信方式。    1)發起關閉一端發出FIN,告訴被關閉端,我關閉發送鏈路,不再發送數據給你,但你可以發送數據給我。    2)被動關閉一端發出ACK,確認。    3)被動關閉一端發出FIN,告訴關閉端,我關閉我的發送鏈路,不再發送數據給你。    4)發起關閉一端發出ACK。7.TIME_WAIT與CLOSE_WAIT狀態 CLOSE_WAIT:  在關閉TCP連接時,  發起TCP連接關閉的一方稱為client,被動關閉的一方稱為server。被動關閉的server收到FIN后,但未發出ACK的TCP狀態是CLOSE_WAIT。 TIME_WAIT:  根據TCP協議定義的3次握手斷開連接規定,發起socket主動關閉的一方 socket將進入TIME_WAIT狀態。  TIME_WAIT狀態將持續2個MSL(Max Segment Lifetime),在Windows下默認為4分鐘,即240秒。  TIME_WAIT狀態下的socket不能被回收使用. 具體現象是對于一個處理大量短連接的服務器,  如果是由服務器主動關閉客戶端的連接,將導致服務器端存在大量的處于TIME_WAIT狀態的socket,   甚至比處于Established狀態下的socket多的多,嚴重影響服務器的處理能力,甚至耗盡可用的socket,停止服務。  可以通過設置端口復用或修改TIME_WAIT等待時間的方式,解決TIME_WAIT狀態的問題。  參考文檔:http://www.cnblogs.com/sunxucool/p/3449068.htmlhttp://www.cnblogs.com/Jessy/p/3535612.html8.TIME_WAIT狀態設置的意義9.SO_REUSEADDR如何解決TIME_WAIT狀態下端口復用的問題?  設置了SO_REUSEADDR這個標志的socket,在bind端口時,如果這個端口沒在使用或者在使用但處于TIME_WAIT狀態,可以綁定成功。  如果正在使用處于非TIME_WAIT狀態,則綁定失敗。參考文檔:http://www.cnblogs.com/qq78292959/archive/2013/01/18/2865926.html9.TCP/IP如何保證數據的準確性和順序性10.線程同步(Linux)  1)互斥鎖  2)信號量  3)條件變量    11.進程間通信socket錯誤編碼表:http://blog.chinaunix.net/uid-116213-id-3376727.html網絡編程:http://blog.csdn.net/weiyuefei/article/category/2821641http://blog.csdn.net/weiyuefei/article/details/52242778復習板塊:1.C/C++基本語法2.TCP/IP協議3.socket編程4.線程和進程同步與異步以及如何編程5.服務器并發處理(epoll)6.使用了哪些開源庫  jsoncpp, tinyxml, openssl, mongodb
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长葛市| 卢氏县| 泗洪县| 新巴尔虎右旗| 当阳市| 余庆县| 兰考县| 建德市| 丹凤县| 苍南县| 泌阳县| 三原县| 舟曲县| 淮南市| 元谋县| 曲麻莱县| 湘潭县| 大埔县| 搜索| 甘肃省| 武冈市| 甘南县| 合作市| 界首市| 阜南县| 阿坝县| 海宁市| 井冈山市| 陇川县| 曲阳县| 寻乌县| 宁乡县| 昌宁县| 剑川县| 石棉县| 日照市| 镇平县| 通海县| 无棣县| 锦屏县| 巴里|