當前位置:首頁 » 編程軟體 » socket編程函數

socket編程函數

發布時間: 2023-04-22 20:29:36

⑴ Socket 編程中 close() 和 shutdown() 有什麼區別

一、指代不同

1、shutdown() :是指禁止在一個套介面上進行數據的接收與發送。

2、close():關閉一個套介面。更確切地說,它釋放套介面描述字s,以後對s的訪問均以WSAENOTSOCK錯誤返回。

二、原理不同

1、shutdown() :how參數為0,則該套介面上的後續接收操作將被禁止。這對於低層協議無影響。對於TCP協議,TCP窗口不改變並接收前來的數據(但不確認)直至窗口滿。對於UDP協議,接收並排隊前來的數據。任何情況下都不會產生ICMP錯誤包。

2、close():為對套介面的最後一次訪問,則相應的名字信息及數據隊列侍大都將被釋放。closesocket()的語首談櫻義受SO_LINGER與SO_DONTLINGER選項影響。


三、特點不同

1、shutdown() :一個應用程序不應依賴於重用一個已被shutdown()禁止的套介面。特別地,一個WINDOWS套介面實現不必支持在這樣的套介面上使用connect()調用。

2、close():如無錯誤發生,則closesocket()返回0。否則的話,返回SOCKET_ERROR錯誤,應用程者叢序可通過WSAGetLastError()獲取相應錯誤代碼。


⑵ 在windows下用c語言如何實現socket網路編程,需要用到哪些頭文件或者庫

需要用到的頭文件包含:

#include <winsock2.h>

#include <windows.h>

linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫

Winsock,一種標准API,一種網路編程介面,用於兩個或多個應用程序(或進程)之間通過網路進行數據通信。具有兩個版本:

Winsock 1:

Windows CE平台支持。

頭文件:WinSock.h

庫:wsock32.lib

Winsock 2:

部分平台如Windows CE貌似不支持。通過前綴WSA可以區別於Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬於Winsock 1.1規范的函數;

頭文件:WinSock2.h

庫:ws2_32.lib

mswsock.h用於編程擴展,使用時必須鏈接mswsock.dll

(2)socket編程函數擴展閱讀

winsock庫的載入與卸載:

載入:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

載入成功,返回值為0。

WORD wVersionRequested:載入的winsock版本,使用宏MAKEWORD(x, y),x表示高位元組,y表示低位元組。然而使用時MAKEWORD(2, 2)。高位元組與低位元組相同~~

LPWSADATA lpWSAData:WSADATA結構的指針,傳入參數後,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。

卸載:int WSACleanup(void);比起載入,卸載的函數真是輕松愉快。

⑶ socket編程到底是什麼

socket 其實就是操作系統提供給程序員操作「網路協議棧」的介面,說人話就是,你能通過socket 的介面,來控制協議找工作,從而實現網路通信,達到跨主機通信。

協議棧的上半部分有兩塊,分別是負責收發數據的 TCP 和 UDP 協議,它們兩會接受應用層的委託執行收發數據的操作。

協議棧的下面一半是用 IP 協議控制網路包收發操作,在互聯網上傳數據時,數據會被切分成一塊塊的網路包,而將網路包發送給對方的操作就是由 IP 負責的。這里需要注意的是,服務端調用 accept 時,連接成功了會返回一個已完成連接的 socket,後續用來傳輸數據。

所以,監聽的 socket 和真正用來傳送數據的 socket,是「兩個」 socket,一個叫作監聽 socket,一個叫作已完成連接 socket。成功連接建立之後,雙方開始通過 read 和 write 函數來讀寫數據,就像往一個文件流裡面寫東西一樣。

⑷ C++的socket方法

C++中Socket方法主要用於網路通信,常用到的函數如下:

CSocket::Socket初始化
CSocket::SetSockOpt設置socket選項
CSocket::Bind綁定地址埠
CSocket::Connect連接
CSocket::Listen監聽
CSocket::Accept接收外部連接的socket
CSocket::Send發送內容
CSocket::Receive接收內容
CSocket::Close關閉(不等於delete)

下面是C++編程下用Socket方法做一個客服端和服務端通信的案例:

1、服務端代碼

//初始化Winscok
if(!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return1;
}

m_exit=false;

CServerDlg*aDlg=(CServerDlg*)lParam;

//獲取埠
CStringstrPort;
aDlg->GetDlgItemText(IDC_EDIT_PORT,strPort);
UINTnPort=atoi(strPort);

//socket----創建2個socket--------------------------------------------
CSocketaSocket,serverSocket;
//最好不要使用aSocket.Create創建,因為容易會出現10048錯誤
if(!aSocket.Socket())
{
charszError[256]={0};
sprintf(szError,"CreateFaild:%d",GetLastError());
AfxMessageBox(szError);
return1;
}

BOOLbOptVal=TRUE;
intbOptLen=sizeof(BOOL);
//設置Socket的選項,解決10048錯誤必須的步驟
aSocket.SetSockOpt(SO_REUSEADDR,(void*)&bOptVal,bOptLen,SOL_SOCKET);

//綁定
if(!aSocket.Bind(nPort))
{
charszError[256]={0};
sprintf(szError,"BindFaild:%d",GetLastError());
AfxMessageBox(szError);
return1;
}

//監聽
if(!aSocket.Listen(10))
{
charszError[256]={0};
sprintf(szError,"ListenFaild:%d",GetLastError());
AfxMessageBox(szError);
return1;
}

CStringstrText;
aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);
strText+="服務已經開啟! ";
aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);
while(!m_exit)
{
//接收外部連接
if(!aSocket.Accept(serverSocket))
{
continue;
}
else
{
charszRecvMsg[256]={0};
charszOutMsg[256]={0};
serverSocket.Receive(szRecvMsg,256);//接收客戶端內容:阻塞
sprintf(szOutMsg,"接受到的參數是:%s ",szRecvMsg);
aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);
strText+=szOutMsg;
aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);
serverSocket.Send("伺服器已經收到,已經做出操作!",50);//發送內容給客戶端
serverSocket.Close();//關閉
}

}

aSocket.Close();
serverSocket.Close();
aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);
strText+="HaveClose!";
aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);
return0;

2、客戶端代碼

//初始化CSocket對象,客戶端可以是用Create因為客戶端不需要綁定任何埠和地址,所以用默認參數即可
//連接指定的地址和埠是用函數Connect函數
//發送內容給伺服器是用send函數
//接收服務端發送的內容使用Receive函數
AfxSocketInit();
CSocketaSocket;
CStringstrIP;
CStringstrPort;
CStringstrText;
this->GetDlgItem(IDC_EDIT_IP)->GetWindowText(strIP);
this->GetDlgItem(IDC_EDIT_PORT)->GetWindowText(strPort);
this->GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(strText);
//初始化CSocket對象,因為客戶端不需要綁定任何埠和地址,所以用默認參數即可
if(!aSocket.Create())
{
charszMsg[1024]={0};

sprintf(szMsg,"createfaild:%d",aSocket.GetLastError());

AfxMessageBox(szMsg);
return;
}
//轉換需要連接的埠內容類型
intnPort=atoi(strPort);
//連接指定的地址和埠
if(aSocket.Connect(strIP,nPort))
{
charszRecValue[1024]={0};
aSocket.Send(strText,strText.GetLength());//發送內容給伺服器
aSocket.Receive((void*)szRecValue,1024);//接收伺服器發送回來的內容(該方法會阻塞,在此等待有內容接收到才繼續向下執行)
AfxMessageBox(szRecValue);
}
else
{
charszMsg[1024]={0};
sprintf(szMsg,"createfaild:%d",aSocket.GetLastError());
AfxMessageBox(szMsg);
}
aSocket.Close();

⑸ socket編程中listen函數作用

socket編程中listen函數是用來偵聽IP請求的。用來把其它主機的IP包傳遞接收過來。

⑹ 求MSDN中關於socket編程中的函數的參數介紹

哥們,網路,裡面都有。
bind函數
bind函數用於將套接字綁定到一個已知的地址上。
語法:
int
bind
(
SOCKET
s,const
struct
sockaddr
FAR*
name,
int
namelen);
參數說明:
s:是一個套接字。
name:是一個sockaddr結構指針,該結構中包含了要結合的地址和埠號。
namelen:確定name緩沖區的長度。
返回值:如果函數執行成功,返回值為0,否則為SOCKET_ERROR。
在定義一個套接字後,需升擾氏要調用bind函數為其指定本機地址、協吵散議和埠號。
下面的代碼創建一個套接字s,將其綁定到3010埠上。
int
port
=
3010;
SOCKET
s
=
socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sockaddr_in
addr;
addr.sin_family
=
AF_INET;
//內部網路協議TCP\UDP等
addr.sin_port
=
htons(port);
//埠號
addr.sin_addr.s_addr
=
htonl(INADDR_ANY);
if
(SOCKET_ERROR
=
bind(s,(LPSOCKADDR)&addr,sizeof(addr))==0)
{
MessageBox("失敗!");
}
listen在套接字函數中表示讓一個套接字處於監聽到來的連接請求的狀態
功能:把一個李頃本地地址與套接字關聯。
參數:
s
一個已綁定未被連接的套接字描述符
backlog
連接請求隊列(queue
of
pending
connections)
的最大長度(一般由2到4)。用SOMAXCONN則由
系統確定。
返回值:
無錯誤,返回0,
否則,返回SOCKET
ERROR,可以調用函數WSAGetLastError取得錯誤代碼。

⑺ c語言socket編程read()函數問題

write/read,是關於寫特定的文件描述符使用的比較底層的系統調用,
sendto/recvfrom適用於用udp(數據包)方式的套接字中使用的,

其他的沒見過,我是學linux編程的

Windows下的socket和Linux下的socket是不一樣的,我沒有查到sendmsg/recvmsg這個方法,上森脊面的鏈接是一個類似的函數,它和send/recv 的區別是,這個函數可以發送socket控制信息,看API就知道。
另外我也沒有看到有write/read函數。 sendto/recvfrom用於UDP鏈此禪滲接,襲數send/recv用於TCP鏈接。
你列舉的其餘函數,我都沒找到。下面的API地址供樓主查詢驗證。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms741692(v=vs.85).aspx

⑻ socket是什麼呀

套接字(Socket),就是對網路中不同主機上的應用進程之間進行雙向通信的端點的抽象。

一個套接字就是網路上進程通信的一端,提供了應用層進程利用網路協議交換數據的機制。從所處的地位來講,套接字上聯應用進程,下聯網路協議棧,是應用程序通過網路協議進行通信的介面,是應用程序與網路協議根進行交互的介面。

套接字是通信的基石,是支持TCP/IP協議的路通信的基本操作單元。

可以將套接字看作不同主機間的進程進行雙間通信的端點,它構成了單個主機內及整個網路間的編程界面。套接字存在於通信域中,通信域是為了處理一般的線程通過套接字通信而引進的一種抽象概念。

套接字通常和同一個域中的套接字交換數據(數據交換也可能穿越域的界限,但這時一定要執行某種解釋程序),各種進程使用這個相同的域互相之間用Internet協議簇來進行通信。

Socket(套接字)可以看成是兩個網路應用程序進行通信時,各自通信連接中的端點,這是一個邏輯上的概念。它是網路環境中進程間通信的API(應用程序編程介面),也是可以被命名和定址的通信端點,使用中的每一個套接字都有其類型和一個與之相連進程。

通信時其中一個網路應用程序將要傳輸的一段信息寫入它所在主機的 Socket中,該 Socket通過與網路介面卡(NIC)相連的傳輸介質將這段信息送到另外一台主機的 Socket中,使對方能夠接收到這段信息。

Socket是由IP地址和埠結合的,提供向應用層進程傳送數據包的機制。

類型

1、數據報套接字

無連接套接字,使用用戶數據報協議(UDP)。在數據報套接字上發送或接收的每個數據包都單獨定址和路由。數據報套接字不能保證順序和可靠性,因此從一台機器或進程發送到另一台機器或進程的多個數據包可能以任何順序到達或可能根本不到達。在數據報套接字上發送廣播可能需要特殊配置。

為了接收廣播數據包,數據報套接字不應該綁定到特定地址,盡管在某些實現中,當數據報套接字綁定到特定地址時也可能接收廣播數據包。

2、流套接字

面向連接的套接字,使用傳輸控制協議(TCP)、流控制傳輸協議(SCTP) 或數據報擁塞控制協議(DCCP)。流套接字提供了無記錄邊界的有序且獨特的無錯誤數據流,並具有用於創建和銷毀連接以及報告錯誤的明確定義的機制。

流套接字以帶外功能可靠地、有序地傳輸數據。在 Internet 上,流套接字通常使用 TCP 實現,以便應用程序可以使用 TCP/IP 協議在任何網路上運行。

3、原始套接字

允許直接發送和接收 IP 數據包,無需任何特定於協議的傳輸層格式。對於其他類型的套接字,根據選擇的傳輸層協議(例如 TCP、UDP)自動封裝有效載荷,並且套接字用戶不知道與有效載荷一起廣播的協議頭的存在。從原始套接字讀取時,通常包含標頭。

從原始套接字傳輸數據包時,自動添加標頭是可選的。

大多數套接字應用程序編程介面(API),例如基於Berkeley 套接字的那些,支持原始套接字。Windows XP於 2001 年發布,在Winsock介面中實現了原始套接字支持,但三年後,微軟出於安全考慮限制了 Winsock 的原始套接字支持。

原始套接字用於與安全相關的應用程序,如Nmap。原始套接字的一個用例是在用戶空間中實現新的傳輸層協議。

原始套接字通常在網路設備中可用,用於路由協議,例如Internet 組管理協議(IGMP) 和開放最短路徑優先(OSPF),以及用於Internet 控制消息協議(ICMP) 等事情,由ping 實用程序。

以上內容參考網路-套接字

熱點內容
籽岷的生存伺服器IP 發布:2025-07-14 08:51:06 瀏覽:419
我的世界搭建tcp伺服器 發布:2025-07-14 08:42:55 瀏覽:659
安卓jj比賽哪個版本有全記牌器 發布:2025-07-14 08:28:27 瀏覽:73
python腳本執行hive 發布:2025-07-14 08:26:24 瀏覽:489
媒體存儲可以刪除嗎 發布:2025-07-14 08:26:13 瀏覽:813
ios網易雲音樂上傳 發布:2025-07-14 08:16:58 瀏覽:393
榮耀8x可以用方舟編譯器嗎 發布:2025-07-14 08:09:49 瀏覽:278
雲伺服器商家怎麼購買 發布:2025-07-14 08:05:34 瀏覽:46
c語言convert函數 發布:2025-07-14 07:56:34 瀏覽:484
sql存儲過程列印 發布:2025-07-14 07:56:26 瀏覽:659