當前位置:首頁 » 生產設備 » 如何將套接字綁定到指定設備

如何將套接字綁定到指定設備

發布時間: 2021-02-22 01:32:18

㈠ java中的socket客戶端的埠如何綁定

java中的socket客戶端只需用伺服器所在機器的ip以及伺服器的埠作為參數創建一個Socket對象就可以了,客戶端的代碼可以看下實例:
Socket socket = new Socket("168.160.12.42",9998);
或:
Socket socket = new Socket(InetAddress.getLocalHost(),5678); // 向主機名為InetAddress.getLocalHost()的伺服器申請連接

客戶機必須知道有關伺服器的IP地址,對於著一點Java也提供了一個相關的類InetAddress 該對象的實例必須通過它的靜態方法來提供,它的靜態方法主要提供了得到本機IP 和通過名字或IP直接得到InetAddress的方法。

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);

以上的程序代碼建立了一個Socket對象,這個對象連接到ip地址為168.160.12.42的主機上、埠為9998的伺服器對象。並且建立了輸入流和輸出流,分別對應伺服器的輸出和客戶端的寫入。

㈡ 如何建立一個socket套接字

解決方法很多!Windows下先是調用WSAStartup()初始化套接子環境,並且在套接字關閉的時候清理內存。再調版用socket(AF_INET,SOCKET_STREAM或SOCET_DATAGRAM,0)函數就權可以創建一個套接字了,調用成功函數返回一個SOCKET句柄。Linux下只要調用socket()函數就可以創建套接字了。

㈢ 請問一個套接字能同時和多個埠綁定嗎

一個套接字不就對應1個埠么
比如192.168.0.2:80
就是192.168.0.2的80埠

怎麼再綁定其他的呢

㈣ 如何釋放IP地址與套接字的綁定關系

應用層通過傳輸層進行數據通信時,TCP和UDP會遇到同時為多個應用程序進程提供並發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個 TCP協議埠傳輸數據。為了區別不同的應用程序進程和連接,許多計算機操作系統為應用程序與TCP/IP協議交互提供了稱為套接字(Socket)的介面。

區分不同應用程序進程間的網路通信和連接,主要有3個參數:通信的目的IP地址、使用的傳輸層協議(TCP或UDP)和使用的埠號。Socket原意是 「插座」。通過將這3個參數結合起來,與一個「插座」Socket綁定,應用層就可以和傳輸層通過套接字介面,區分來自不同應用程序進程或網路連接的通信,實現數據傳輸的並發服務。

-- win API socket
本文所談到的Socket函數如果沒有特別說明,都是指的Windows Socket API。

一、WSAStartup函數
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
使用Socket的程序在使用Socket之前必須調用WSAStartup函數。該函數的第一個參數指明程序請求使用的Socket版本,其中高位位元組指明副版本、低位位元組指明主版本;操作系統利用第二個參數返回請求的Socket的版本信息。當一個應用程序調用WSAStartup函數時,操作系統根據請求的Socket版本來搜索相應的Socket庫,然後綁定找到的Socket庫到該應用程序中。以後應用程序就可以調用所請求的 Socket庫中的其它Socket函數了。該函數執行成功後返回0。
例:假如一個程序要使用2.1版本的Socket,那麼程序代碼如下
wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );

二、WSACleanup函數
int WSACleanup (void);
應用程序在完成對請求的Socket庫的使用後,要調用WSACleanup函數來解除與Socket庫的綁定並且釋放Socket庫所佔用的系統資源。

三、socket函數
SOCKET socket(
int af,
int type,
int protocol
);
應用程序調用socket函數來創建一個能夠進行網路通信的套接字。第一個參數指定應用程序使用的通信協議的協議族,對於TCP/IP協議族,該參數置PF_INET;第二個參數指定要創建的套接字類型,流套接字類型為SOCK_STREAM、數據報套接字類型為SOCK_DGRAM;第三個參數指定應用程序所使用的通信協議。該函數如果調用成功就返回新創建的套接字的描述符,如果失敗就返回INVALID_SOCKET。套接字描述符是一個整數類型的值。每個進程的進程空間里都有一個套接字描述符表,該表中存放著套接字描述符和套接字數據結構的對應關系。該表中有一個欄位存放新創建的套接字的描述符,另一個欄位存放套接字數據結構的地址,因此根據套接字描述符就可以找到其對應的套接字數據結構。每個進程在自己的進程空間里都有一個套接字描述符表但是套接字數據結構都是在操作系統的內核緩沖里。下面是一個創建流套接字的例子:
struct protoent *ppe;
ppe=getprotobyname("tcp");
SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto);

四、closesocket函數
int closesocket(
SOCKET s
);
closesocket函數用來關閉一個描述符為s套接字。由於每個進程中都有一個套接字描述符表,表中的每個套接字描述符都對應了一個位於操作系統緩沖區中的套接字數據結構,因此有可能有幾個套接字描述符指向同一個套接字數據結構。套接字數據結構中專門有一個欄位存放該結構的被引用次數,即有多少個套接字描述符指向該結構。當調用closesocket函數時,操作系統先檢查套接字數據結構中的該欄位的值,如果為1,就表明只有一個套接字描述符指向它,因此操作系統就先把s在套接字描述符表中對應的那條表項清除,並且釋放s對應的套接字數據結構;如果該欄位大於1,那麼操作系統僅僅清除s在套接字描述符表中的對應表項,並且把s對應的套接字數據結構的引用次數減1。
closesocket函數如果執行成功就返回0,否則返回SOCKET_ERROR。

五、send函數
int send(
SOCKET s,
const char FAR *buf,
int len,
int flags
);
不論是客戶還是伺服器應用程序都用send函數來向TCP連接的另一端發送數據。客戶程序一般用send函數向伺服器發送請求,而伺服器則通常用 send函數來向客戶程序發送應答。該函數的第一個參數指定發送端套接字描述符;第二個參數指明一個存放應用程序要發送數據的緩沖區;第三個參數指明實際要發送的數據的位元組數;第四個參數一般置0。這里只描述同步Socket的send函數的執行流程。當調用該函數時,send先比較待發送數據的長度 len和套接字s的發送緩沖區的長度,如果len大於s的發送緩沖區的長度,該函數返回SOCKET_ERROR;如果len小於或者等於s的發送緩沖區的長度,那麼send先檢查協議是否正在發送s的發送緩沖中的數據,如果是就等待協議把數據發送完,如果協議還沒有開始發送s的發送緩沖中的數據或者s的發送緩沖中沒有數據,那麼send就比較s的發送緩沖區的剩餘空間和len,如果len大於剩餘空間大小send就一直等待協議把s的發送緩沖中的數據發送完,如果len小於剩餘空間大小send就僅僅把buf中的數據到剩餘空間里(注意並不是send把s的發送緩沖中的數據傳到連接的另一端的,而是協議傳的,send僅僅是把buf中的數據到s的發送緩沖區的剩餘空間里)。如果send函數數據成功,就返回實際的位元組數,如果send在數據時出現錯誤,那麼send就返回SOCKET_ERROR;如果send在等待協議傳送數據時網路斷開的話,那麼send 函數也返回SOCKET_ERROR。要注意send函數把buf中的數據成功到s的發送緩沖的剩餘空間里後它就返回了,但是此時這些數據並不一定馬上被傳到連接的另一端。如果協議在後續的傳送過程中出現網路錯誤的話,那麼下一個Socket函數就會返回SOCKET_ERROR。(每一個除 send外的Socket函數在執行的最開始總要先等待套接字的發送緩沖中的數據被協議傳送完畢才能繼續,如果在等待時出現網路錯誤,那麼該Socket 函數就返回SOCKET_ERROR)
注意:在Unix系統下,如果send在等待協議傳送數據時網路斷開的話,調用send的進程會接收到一個SIGPIPE信號,進程對該信號的默認處理是進程終止。

六、recv函數
int recv(
SOCKET s,
char FAR *buf,
int len,
int flags
);
不論是客戶還是伺服器應用程序都用recv函數從TCP連接的另一端接收數據。該函數的第一個參數指定接收端套接字描述符;第二個參數指明一個緩沖區,該緩沖區用來存放recv函數接收到的數據;第三個參數指明buf的長度;第四個參數一般置0。這里只描述同步Socket的recv函數的執行流程。當應用程序調用recv函數時,recv先等待s的發送緩沖中的數據被協議傳送完畢,如果協議在傳送s的發送緩沖中的數據時出現網路錯誤,那麼 recv函數返回SOCKET_ERROR,如果s的發送緩沖中沒有數據或者數據被協議成功發送完畢後,recv先檢查套接字s的接收緩沖區,如果s接收緩沖區中沒有數據或者協議正在接收數據,那麼recv就一直等待,只到協議把數據接收完畢。當協議把數據接收完畢,recv函數就把s的接收緩沖中的數據 到buf中(注意協議接收到的數據可能大於buf的長度,所以在這種情況下要調用幾次recv函數才能把s的接收緩沖中的數據完。 recv函數僅僅是數據,真正的接收數據是協議來完成的),recv函數返回其實際的位元組數。如果recv在時出錯,那麼它返回 SOCKET_ERROR;如果recv函數在等待協議接收數據時網路中斷了,那麼它返回0。
注意:在Unix系統下,如果recv函數在等待協議接收數據時網路斷開了,那麼調用recv的進程會接收到一個SIGPIPE信號,進程對該信號的默認處理是進程終止。

七、bind函數
int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
當創建了一個Socket以後,套接字數據結構中有一個默認的IP地址和默認的埠號。一個服務程序必須調用bind函數來給其綁定一個IP地址和一個特定的埠號。客戶程序一般不必調用bind函數來為其Socket綁定IP地址和斷口號。該函數的第一個參數指定待綁定的Socket描述符;第二個參數指定一個sockaddr結構,該結構是這樣定義的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
sa_family指定地址族,對於TCP/IP協議族的套接字,給其置AF_INET。當對TCP/IP協議族的套接字進行綁定時,我們通常使用另一個地址結構:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
其中sin_family置AF_INET;sin_port指明埠號;sin_addr結構體中只有一個唯一的欄位s_addr,表示IP地址,該欄位是一個整數,一般用函數inet_addr()把字元串形式的IP地址轉換成unsigned long型的整數值後再置給s_addr。有的伺服器是多宿主機,至少有兩個網卡,那麼運行在這樣的伺服器上的服務程序在為其Socket綁定IP地址時可以把htonl(INADDR_ANY)置給s_addr,這樣做的好處是不論哪個網段上的客戶程序都能與該服務程序通信;如果只給運行在多宿主機上的服務程序的Socket綁定一個固定的IP地址,那麼就只有與該IP地址處於同一個網段上的客戶程序才能與該服務程序通信。我們用0來填充 sin_zero數組,目的是讓sockaddr_in結構的大小與sockaddr結構的大小一致。下面是一個bind函數調用的例子:
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8888);
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(ListenSocket,(struct sockaddr *)&saddr,sizeof(saddr));

八、listen函數
int listen( SOCKET s, int backlog );
服務程序可以調用listen函數使其流套接字s處於監聽狀態。處於監聽狀態的流套接字s將維護一個客戶連接請求隊列,該隊列最多容納backlog個客戶連接請求。假如該函數執行成功,則返回0;如果執行失敗,則返回SOCKET_ERROR。

九、accept函數
SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
);
服務程序調用accept函數從處於監聽狀態的流套接字s的客戶連接請求隊列中取出排在最前的一個客戶請求,並且創建一個新的套接字來與客戶套接字創建連接通道,如果連接成功,就返回新創建的套接字的描述符,以後與客戶套接字交換數據的是新創建的套接字;如果失敗就返回 INVALID_SOCKET。該函數的第一個參數指定處於監聽狀態的流套接字;操作系統利用第二個參數來返回新創建的套接字的地址結構;操作系統利用第三個參數來返回新創建的套接字的地址結構的長度。下面是一個調用accept的例子:
struct sockaddr_in ServerSocketAddr;
int addrlen;
addrlen=sizeof(ServerSocketAddr);
ServerSocket=accept(ListenSocket,(struct sockaddr *)&ServerSocketAddr,&addrlen);

十、connect函數
int connect(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
客戶程序調用connect函數來使客戶Socket s與監聽於name所指定的計算機的特定埠上的服務Socket進行連接。如果連接成功,connect返回0;如果失敗則返回SOCKET_ERROR。下面是一個例子:
struct sockaddr_in daddr;
memset((void *)&daddr,0,sizeof(daddr));
daddr.sin_family=AF_INET;
daddr.sin_port=htons(8888);
daddr.sin_addr.s_addr=inet_addr("133.197.22.4");
connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr));

㈤ C++ 套接字如何綁定在固定IP上

檢查bind的返回值。返回0才代表綁定成功。
「不監聽直接運行」這個描述比較像是listen和accept沒有動作。可能是因為綁定失敗導致

㈥ 如何在某個程序建立的套接字上發信息

您好,這樣的:
在UNIX 操 作 系 統 下 可 用Doscp 命 名 拷 入 硬 盤; 編 譯 時 用:
cc hxserver.c -lsocket -0 server
cc hxclient.c -lsocket -0 client

在AIX 操 作 系 統 下 可 用Dosread 命 名 拷 入 硬 盤, 編 譯 時 用:
cc hxserver.c -0 server
cc hxclient.c -0 client
/*伺服器端程序:hxserver.c*/

#include

#include

#include

#include

#include "tcpipop.c"main()

{

int newsockfd, sockfd;

int clilen;

struct sockaddr_in cli_addr, serv_addr;

char info[100];

int infolen;

int rc;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)/*創建TCP協議的位元組流*/

{

fprintf(stderr, "Socket failed !!\n");

return(-1);

}

bzero((char *)&serv_addr, sizeof(serv_addr));/*伺服器地址清0*/

serv_addr.sin_family = AF_INET;/*網路類型使用ARPA internet地址*/

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

/*IP地址取公認的任意合法地址*/

serv_addr.sin_port = htons(1234);

/*設定IP埠號, 並將主機位元組順序轉換為網路位元組順序*/ if ( bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 )

/*將伺服器地址信息捆綁到創建的套接字上*/

{

fprintf(stderr, "Bind failed !!\n");

return(-1);

} if ( listen(sockfd, 5) < 0 )/*建立長度為5的監聽隊列從套接字上收聽連接請求*/

{

fprintf(stderr, "Listen failed !!\n");

return(-1);

}

fprintf(stderr, "blocked here.....\n");


㈦ 如何建立socket連接

socket建立連接的過程如下:

  1. 建立套接字

    socket()打開一個網路通訊埠,如果成功的話,就像open()一樣返回一個文件描述符,應用程序可以像讀寫文件一樣用read/write在網路上收發數據,如果socket()調用出錯則返回-1。

  2. 在 INET BSD 套接字上綁定(bind)地址

    為了監聽傳入的 Internet 連接請求,每個伺服器都需要建立一個 INET BSD 套接字,並且將自己的地址綁定到該套接字。綁定操作主要在 INET 套接字層中進行,還需要底層 TCP 層和 IP 層的某些支持。將地址綁定到某個套接字上之後,該套接字就不能用來進行任何其他的通訊。

  3. 在 INET BSD 套接字上建立連接(connect)

    創建一個套接字之後,該套接字不僅可以用於監聽入站的連接請求,也可以用於建立出站的連接請求。不論怎樣都涉及到一個重要的過程:建立兩個應用程序之間的虛擬電路。

  4. 監聽(listen) INET BSD 套接字

    典型的伺服器程序可以同時服務於多個客戶端,當有客戶端發起連接時,伺服器調用的accept()返回並接受這個連接,如果有大量的客戶端發起連接而伺服器來不及處理,尚未accept的客戶端就處於連接等待狀態,listen()聲明sockfd處於監聽狀態,並且最多允許有backlog個客戶端處於連接待狀態,如果接收到更多的連接請求就忽略。listen()成功返回0,失敗返回-1。

  5. 接受連接請求 (accept)

    其過程如下:接受操作首先傳遞到支持協議層,即 INET 中,以便接受任何傳入的連接請求。相反,接受操作進一步傳遞到實際的協議,例如TCP 上。接受操作可以是阻塞的,也可以是非阻塞的。接受操作為非阻塞的情況下,如果沒有可接受的傳入連接,則接受操作將失敗,而新建立的 socket 數據結構被拋棄。接受操作為阻塞的情況下,執行阻塞操作的網路應用程序將添加到等待隊列中,並保持掛起直到接收到一個 TCP 連接請求為至。

㈧ 如何設置 Windows Phone 套接字的連接要求

在下面的步驟中,您可以僅出於測試目的將代碼置於一個按鍵的點按事件中。以下過程假定您擁有一個 Windows

㈨ linux一個程序可以創建幾個套接字求大神指點迷津 可以創建多個套接字么每個套接字綁定一

埠是唯一的,系統中任一個埠只能被一個程序佔用。
一個程序可以創建多個Socket,但多個Socket是不能共用埠的。

㈩ 如何編寫socket套接字

Socket套接字相當於網路通信兩端的插座,只要對方的Socket和自己的Socket有通信聯接,雙方就可以發送和接收數據。其定義類似於文件句柄的定義。
如果編寫的是服務程序,那麼先調用socket()創建一個套接字,調用bind()綁定IP地址和埠,然後啟動一個死循環,循環中調用accept()接受連接。對於每個接受的連接,可以啟動多線程方式進行處理,在線程中調用send()、recv()發送和接收數據。
如果編寫的是客戶端程序,則先調用socket()創建一個套接字,然後調用connect()連接伺服器,之後就是調用send()、recv()發送和接收數據了。
服務端程序編寫:
1、調用ServerSocket(int port)創建一個伺服器端套接字,並綁定到指定埠上。
2、調用accept(),監聽連接請求,接收連接,返回通信套接字。
3、調用Socket類的getOutStream()和getInputStream獲取輸出和輸入流,開始網路數據的發送和接收。
4、關閉通信套接字.Socket.close()。
客戶端程序編寫:
1、調用Socket()創建一個流套接字,並連接到伺服器端。
2、調用Socket類的getOutputStream()和fetInputStream()獲取輸出流和輸入流,開始網路數據的發送和接收。
3、關閉通信套接字.Socket.close()。

熱點內容
線切割怎麼導圖 發布:2021-03-15 14:26:06 瀏覽:709
1台皮秒機器多少錢 發布:2021-03-15 14:25:49 瀏覽:623
焊接法蘭如何根據口徑配螺栓 發布:2021-03-15 14:24:39 瀏覽:883
印章雕刻機小型多少錢 發布:2021-03-15 14:22:33 瀏覽:395
切割機三五零木工貝片多少錢 發布:2021-03-15 14:22:30 瀏覽:432
加工盜磚片什麼櫸好 發布:2021-03-15 14:16:57 瀏覽:320
北洋機器局製造的銀元什麼樣 發布:2021-03-15 14:16:52 瀏覽:662
未來小七機器人怎麼更新 發布:2021-03-15 14:16:33 瀏覽:622
rexroth加工中心亂刀怎麼自動調整 發布:2021-03-15 14:15:05 瀏覽:450
機械鍵盤的鍵帽怎麼選 發布:2021-03-15 14:15:02 瀏覽:506