Socket 之 API函數介紹

1、創建套接字──socket()

  應用程序在使用套接字前,首先必須擁有一個套接字,系統調用socket()向應用程序提供創建套接字的手段,其調用格式如下:

  SOCKET PASCAL FAR socket(int af, int type, int protocol);

  該調用要接收三個參數:af、type、protocol。

  (1)af:指定通信發生的區域:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中僅支持AF_INET,它是網際網區域。因此,地址族與協議族相同。

  (2)type:描述要建立的套接字的類型。這里分三種:

  [1]TCP流式套接字(SOCK_STREAM):提供了一個面向連接、可靠的數據傳輸服務,數據無差錯、無重復地發送,且按發送順序接收。內設流量控制,避免數據流超限;數據被看作是字節流,無長度限制。文件傳送協議(FTP)即使用流式套接字。

  [2]數據報式套接字(SOCK_DGRAM):提供了一個無連接服務。數據包以獨立包形式被發送,不提供無錯保證,數據可能丟失或重復,并且接收順序混亂。網絡文件系統(NFS)使用數據報式套接字。

  [3]原始式套接字(SOCK_RAW):該接口允許對較低層協議,如IP、ICMP直接訪問。常用于檢驗新的協議實現或訪問現有服務中配置的新設備。

  (3)protocol:說明該套接字使用的特定協議,如果調用者不希望特別指定使用的協議,則置為0,使用默認的連接模式。

  根據這三個參數建立一個套接字,并將相應的資源分配給它,同時返回一個整型套接字號。因此,socket()系統調用實際上指定了相關五元組中的“協議”這一元。

?

2、指定本地地址──bind()

  當一個套接字用socket()創建后,存在一個名字空間(地址族),但它沒有被命名。bind()將套接字地址(包括本地主機地址和本地端口地址)與所創建的套接字號聯系起來,即將名字賦予套接字,以指定本地半相關。其調用格式如下:

  int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen);

  (1)s:是由socket()調用返回的并且未作連接的套接字描述符(套接字號)。

  (2)name:是賦給套接字s的本地地址(名字),其長度可變,結構隨通信域的不同而不同。

  (3)namelen:表明了name的長度。

  如果沒有錯誤發生,bind()返回0。否則返回SOCKET_ERROR。

?

3、建立套接字連接──connect()與accept()

  這兩個系統調用用于完成一個完整相關的建立,其中connect()用于建立連接。accept()用于使服務器等待來自某客戶進程的實際連接。

  connect()的調用格式如下:

  int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen);

  參數s是欲建立連接的本地套接字描述符。

  參數name指出說明對方套接字地址結構的指針。

  對方套接字地址長度由namelen說明。

  如果沒有錯誤發生,connect()返回0。否則返回值SOCKET_ERROR。在面向連接的協議中,該調用導致本地系統和外部系統之間連接實際建立。

  由于地址簇總被包含在套接字地址結構的前兩個字節中,并通過socket()調用與某個協議簇相關。因此bind()和connect()無須協議作為參數。

  accept()的調用格式如下:

  SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen);

  參數s為本地套接字描述符,在用做accept()調用的參數前應該先調用過listen()。

  addr 指向客戶方套接字地址結構的指針,用來接收連接實體的地址。addr的確切格式由套接字創建時建立的地址族決定。

  addrlen 為客戶方套接字地址的長度(字節數)。

  如果沒有錯誤發生,accept()返回一個SOCKET類型的值,表示接收到的套接字的描述符。否則返回值INVALID_SOCKET。

  accept()用于面向連接服務器。參數addr和addrlen存放客戶方的地址信息。調用前,參數addr 指向一個初始值為空的地址結構,而addrlen 的初始值為0;調用accept()后,服務器等待從編號為s的套接字上接受客戶連接請求,而連接請求是由客戶方的connect()調用發出的。當有連接請求到達時,accept()調用將請求連接隊列上的第一個客戶方套接字地址及長度放入addr 和addrlen,并創建一個與s有相同特性的新套接字號。新的套接字可用于處理服務器并發請求。

  四個套接字系統調用,socket()、bind()、connect()、accept(),可以完成一個完全五元相關的建立。socket()指定五元組中的協議元,它的用法與是否為客戶或服務器、是否面向連接無關。bind()指定五元組中的本地二元,即本地主機地址和端口號,其用法與是否面向連接有關:在服務器方,無論是否面向連接,均要調用bind(),若采用面向連接,則可以不調用bind(),而通過connect()自動完成。若采用無連接,客戶方必須使用bind()以獲得一個唯一的地址。

?

4、監聽連接──listen()

  此調用用于面向連接服務器,表明它愿意接收連接。listen()需在accept()之前調用,其調用格式如下:

  int PASCAL FAR listen(SOCKET s, int backlog);

  參數s標識一個本地已建立、尚未連接的套接字號,服務器愿意從它上面接收請求。

  backlog表示請求連接隊列的最大長度,用于限制排隊請求的個數,目前允許的最大值為5。

  如果沒有錯誤發生,listen()返回0。否則它返回SOCKET_ERROR。

  listen()在執行調用過程中可為沒有調用過bind()的套接字s完成所必須的連接,并建立長度為backlog的請求連接隊列。

  調用listen()是服務器接收一個連接請求的四個步驟中的第三步。它在調用socket()分配一個流套接字,且調用bind()給s賦于一個名字之后調用,而且一定要在accept()之前調用。

?

5、數據傳輸──send()與recv()

  當一個連接建立以后,就可以傳輸數據了。常用的系統調用有send()和recv()。

  send()調用用于s指定的已連接的數據報或流套接字上發送輸出數據,格式如下:

  int PASCAL FAR send(SOCKET s, const char FAR *buf, int len, int flags);

  參數s為已連接的本地套接字描述符。

  buf 指向存有發送數據的緩沖區的指針,其長度由len 指定。

  flags 指定傳輸控制方式,如是否發送帶外數據等。

  如果沒有錯誤發生,send()返回總共發送的字節數。否則它返回SOCKET_ERROR。

  recv()調用用于s指定的已連接的數據報或流套接字上接收輸入數據,格式如下:

  int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags);

  參數s 為已連接的套接字描述符。

  buf指向接收輸入數據緩沖區的指針,

  其長度由len 指定。

  flags 指定傳輸控制方式,如是否接收帶外數據等。

  如果沒有錯誤發生,recv()返回總共接收的字節數。如果連接被關閉,返回0。否則它返回SOCKET_ERROR。

?

6、輸入/輸出多路復用──select()

  select()調用用來檢測一個或多個套接字的狀態。對每一個套接字來說,這個調用可以請求讀、寫或錯誤狀態方面的信息。請求給定狀態的套接字集合由一個fd_set結構指示。在返回時,此結構被更新,以反映那些滿足特定條件的套接字的子集,同時, select()調用返回滿足條件的套接字的數目,其調用格式如下:

  int PASCAL FAR select(int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout);

  參數nfds指明被檢查的套接字描述符的值域,此變量一般被忽略。

  參數readfds指向要做讀檢測的套接字描述符集合的指針,調用者希望從中讀取數據。

  參數writefds 指向要做寫檢測的套接字描述符集合的指針。

  exceptfds指向要檢測是否出錯的套接字描述符集合的指針。

  timeout指向select()函數等待的最大時間,如果設為NULL則為阻塞操作。

  select()返回包含在fd_set結構中已準備好的套接字描述符的總數目,或者是發生錯誤則返回SOCKET_ERROR。

?

7、關閉套接字──closesocket()

  closesocket()關閉套接字s,并釋放分配給該套接字的資源;如果s涉及一個打開的TCP連接,則該連接被釋放。closesocket()的調用格式如下:

  BOOL PASCAL FAR closesocket(SOCKET s);

  參數s待關閉的套接字描述符。

  如果沒有錯誤發生,closesocket()返回0。否則返回值SOCKET_ERROR。

?

以上就是SOCKET API一些常用的API函數,下面是一段代碼:

?

//客戶端代碼:

#include <WINSOCK2.H>

#include <stdio.h>

#pragma comment(lib,"ws2_32.lib")

?

int main()

{

?????? int err;

?????? WORD versionRequired;

?????? WSADATA wsaData;

?????? versionRequired=MAKEWORD(1,1);

?????? err=WSAStartup(versionRequired,&wsaData);//協議庫的版本信息

??????

?????? if (!err)

?????? {

????????????? printf("客戶端嵌套字已經打開!\n");

?????? }

?????? else

?????? {

????????????? printf("客戶端的嵌套字打開失敗!\n");

????????????? return 0;//結束

?????? }

?????? SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0);

?????? SOCKADDR_IN clientsock_in;

?????? clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

?????? clientsock_in.sin_family=AF_INET;

?????? clientsock_in.sin_port=htons(6000);

?????? //bind(clientSocket,(SOCKADDR*)&clientsock_in,strlen(SOCKADDR));//注意第三個參數

?????? //listen(clientSocket,5);

?????? connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//開始連接

??????

?????? char receiveBuf[100];

?????? recv(clientSocket,receiveBuf,101,0);

?????? printf("%s\n",receiveBuf);

??????

?????? send(clientSocket,"hello,this is client",strlen("hello,this is client")+1,0);

?????? closesocket(clientSocket);

?????? WSACleanup();

?????? return 0;

}

?

///

//服務器端代碼:

#include <WINSOCK2.H>

#include <stdio.h>

#pragma comment(lib,"ws2_32.lib")

int main()

{

?????? //創建套接字

?????? WORD myVersionRequest;

?????? WSADATA wsaData;

?????? myVersionRequest=MAKEWORD(1,1);

?????? int err;

?????? err=WSAStartup(myVersionRequest,&wsaData);

?????? if (!err)

?????? {

????????????? printf("已打開套接字\n");

?????????????

?????? }

?????? else

?????? {

????????????? //進一步綁定套接字

????????????? printf("嵌套字未打開!");

????????????? return 0;

?????? }

?????? SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//創建了可識別套接字

?????? //需要綁定的參數

?????? SOCKADDR_IN addr;

?????? addr.sin_family=AF_INET;

?????? addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址

?????? addr.sin_port=htons(6000);//綁定端口

??????

?????? bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//綁定完成

?????? listen(serSocket,5);//其中第二個參數代表能夠接收的最多的連接數

??????

?????? //

?????? //開始進行監聽

?????? //

?????? SOCKADDR_IN clientsocket;

?????? int len=sizeof(SOCKADDR);

?????? while (1)

?????? {

????????????? SOCKET serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果這里不是accept而是conection的話。。就會不斷的監聽

????????????? char sendBuf[100];

?????????????

????????????? sprintf(sendBuf,"welcome %s to bejing",inet_ntoa(clientsocket.sin_addr));//找對對應的IP并且將這行字打印到那里

????????????? send(serConn,sendBuf,strlen(sendBuf)+1,0);

????????????? char receiveBuf[100];//接收

????????????? recv(serConn,receiveBuf,strlen(receiveBuf)+1,0);

????????????? printf("%s\n",receiveBuf);

????????????? closesocket(serConn);//關閉

????????????? WSACleanup();//釋放資源的操作

?????? }

?????? return 0;

}

轉載于:https://www.cnblogs.com/xinaixia/p/5460557.html

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

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

相關文章

分配的訪問權限的展臺應用:最佳做法

原文: 分配的訪問權限的展臺應用&#xff1a;最佳做法 best practices guidance for developing a kiosk app for assigned access. 在 Windows 10 中&#xff0c;你可以使用鎖屏框架和分配的訪問權限創建展臺應用&#xff0c;該應用允許用戶與設備上的單個應用進行交互。 本文…

計算機工程 目錄 2014年第1期 pdf,2013科技核心期刊目錄有效期至2014年).pdf

2013科技核心期刊目錄有效期至2014年).pdf中國科技核心期刊(中國科技論文統計源期刊)2013CODE 期刊名稱2013 年新入選F034 ACTA BIOCHIMICA ET BIOPHYSICA SINICAC096 ACTA MATHEMATICA SCIENTIAB030 ACTA MATHEMATICA SINICA ENGLISH SERIESI051 ACTA MATHEMATICAE APPLICATAE…

SQL Server 阻止了對組件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的訪問的解決方案...

今天寫了一個excel表的導入功能&#xff0c;結果在excel表中的內容導入到頁面時報錯&#xff1a;SQL Server 阻止了對組件 Ad Hoc Distributed Queries 的 STATEMENTOpenRowset/OpenDatasource 的訪問&#xff0c;因為此組件已作為此服務器安全配置的一部分而被關閉。系統管…

Mongo客戶端MongoVUE的基本使用

這里沒有涉及到服務器以及客戶端的安裝&#xff0c;文章主要介紹mongo客戶端mongoVUE的使用 一、數據庫連接 點擊綠色加號添加一個連接&#xff0c;輸入name、server、port&#xff0c;點擊save&#xff0c;點擊connect進行連接 二、添加 1.右鍵添加一個Database 2.輸入名稱&am…

Vim雜記:Sublime的配色方案

一、前言                                     愛美之心人皆有之&#xff0c;sublime的配色實在好看&#xff0c;于是希望Vim也能這樣。 二、配置                                     1.下載monok…

計算機一級考試有三科,全國計算機一級考試是一級WPS?Office?一級MS?Office?一級Photoshop?三個任選一個考試嗎?...

滿意答案nanrrui3j2017.08.24采納率&#xff1a;41% 等級&#xff1a;9已幫助&#xff1a;415人全國計算機一級考試是有考試大綱的&#xff0c;按照大綱要求是三科都考。一級MS Office、一級WPS Office、一級Photoshop&#xff0c;一級共三個科目。完全采取上機考試形式&…

mysql索引結構原理、性能分析與優化

摘要&#xff1a; 第一部分&#xff1a;基礎知識 第二部分&#xff1a;MYISAM和INNODB索引結構 1、簡單介紹B-tree B tree樹 2、MyisAM索引結構 3、Annode索引結構 4、MyisAM索引與InnoDB索引相比較 第三部分&#xff1a;MYSQL優化 1、表數據類型選擇 2、sql語句優化 (1) 最…

Docker學習(三):鏡像

2019獨角獸企業重金招聘Python工程師標準>>> 1、簡介 docker運行前需要本地存在對應的鏡像&#xff0c;若鏡像不存在本地&#xff0c;docker會先嘗試從默認的鏡像倉庫下載&#xff08;Docker Hub公共注冊服務器中的倉庫&#xff09;。用戶也可以配置&#xff0c;使用…

系統流程圖

轉載于:https://www.cnblogs.com/ADCARRY/p/5462270.html

一年級下冊計算機教學計劃,【實用】一年級下冊教學計劃4篇

【實用】一年級下冊教學計劃4篇光陰迅速&#xff0c;一眨眼就過去了&#xff0c;我們的教學工作又將抒寫新的篇章&#xff0c;寫好教學計劃才不會讓我們努力的時候迷失方向哦。相信大家又在為寫教學計劃犯愁了吧&#xff0c;下面是小編精心整理的一年級下冊教學計劃4篇&#xf…

Discretized Streams: An Efficient and Fault-Tolerant Model for Stream Processing on Large Clusters

閱讀筆記 概述&#xff1a; 本文同樣發表于2012年。提出了一種稱為離散化數據流(Discretized Streams,D-Streams)的編程模型。該模型提供了一種高級函數式API&#xff0c;具有高度的一致性和強大的容錯能力。基于Spark分布式計算框架&#xff0c;進行擴展實現了一個D-Stream的原…

復習計劃

算法 貪心 二分 模擬 倍增 排序 sort 歸并排序 插入排序 最短路 SPFA Djistra Floyd 最小生成樹 kruskal prim 拓撲排序 tarjan 二分圖 樹的直徑、樹的重心 dfs序 hash 數據結構 棧 隊列 單調隊列 單調棧https://www.luogu.org/problem/show?pid2659 并查集 線段樹 樹狀數組 二…

計算機應用基礎分析與報告,y計算機應用基礎出題分析報告.doc

y計算機應用基礎出題分析報告計算機應用基礎出題分析報告本次計算機應用基礎抽考試題按照2011年甘肅省三校生高考考試標準&#xff0c;重在考查學生對windows xp和office辦公軟件基本概念、基本操作的掌握情況。以充分體現基礎理論和實踐操作相結合為主&#xff0c;深入淺出地將…

mysql left join join right

create table java (name varchar(255)); insert into java values (java1),(java2),(blue); create table mysql (name varchar(255)); insert into mysql values (mysql1),(mysql2),(blue); 1.join 查詢 內聯查詢 查兩個表的內才聯系相同的值select * from java join mysql a…

PowerDesigner中NAME和COMMENT的互相轉換,需要執行語句

原文&#xff1a;http://www.cnblogs.com/yelaiju/archive/2013/04/26/3044828.html由于PDM 的表中 Name 會默認Code 所以很不方便, 所以需要將 StereoType 顯示到表的外面來 打開[工具]->[顯示屬性](英文:Display Preferences) ->Content->Table->右邊面板Columns…

成都計算機中心起名,成都給寶寶起名的地方哪里好

成都給寶寶起名的地方哪里好2018-09-21每一個人都擁有一個好聽大氣的名字&#xff0c;名字作為一個人的標識&#xff0c;是人與人交流的代號&#xff0c;因此有一個好聽寓意大氣的名字是很關鍵的&#xff0c;名字畢竟關乎著對他人的第一印象&#xff0c;所以在起名字方面父母們…

20150206--JS鞏固與加強4-02

20150206--JS鞏固與加強4-02 五、屬性遍歷與刪除 1、使用for…in…遍歷自定義對象屬性 基本語法&#xff1a; for…in…&#xff08;主要是完成對對象的遍歷&#xff09; 示例代碼: 運行效果&#xff1a; 說明&#xff1a;在17行代碼&#xff0c;不能使用p1.i形式進行自定義對象…

Python安裝scikit-learn包

我先是按照網上說的下載了個setuptools,然后直接用這個工具去安裝&#xff0c;可是安裝scikit-learn包的時候確老是有錯誤&#xff0c;也不知道錯誤是啥&#xff0c;所以就不用setuptools來安裝了。 我直接下載了scikit-learn包的安裝包&#xff0c;直接安裝就好了&#xff0c;…

如何計算機械人工作量,修訂后太原理工大學本科教學工作量計算辦法

太原理工大學教師本科教學工作量計算辦法(修訂)高等學校實行工作量考核制度是進行教學管理改革的一項重要措施。實踐證明&#xff0c;教學工作量考核的實行&#xff0c;有利于穩定教學秩序、提高教學質量&#xff0c;有利于加強師資隊伍的建設與管理&#xff0c;有利于保證教學…

面向對象課程 - T-shirt

拿到了一件謎一樣的T-shirt 嚇得我趕緊捏了下hbb 轉載于:https://www.cnblogs.com/andwho/p/5465165.html