導航:首頁 > 源碼編譯 > bind導致編譯失敗

bind導致編譯失敗

發布時間:2022-02-24 03:07:40

① VC網路編程socket創建成功但是bind失敗(很簡單)

用的是阻塞方式進行的通信,當通信超時時就會出現錯誤,可以開線程,交替循環三次sendto和recvfrom,失敗後,利用catch(...)退出來即可

② C++函數 bind error

Socket編程首先要包含所需的頭文件Winsock2.h並工程中添加庫文件ws2_32.lib.
接著載入套接字型檔所用函數是
WSAStartup( wVersionRequested, &wsaData ); 第一個參數代表的是所要載入的套接字型檔的版本,第二個參數用於存儲返回的版本信息
wVersionRequested = MAKEWORD( 1, 1 );用MAKEWORD來設置版本號的值其中地位代表主版本號

TCP編程:
伺服器端的編寫:
1. 創建套接字
SOCKET socketSrc = socket(AF_INET, SOCK_STREAM, 0);
第一個參數:指定地址族在1.1版本中只能使用AF_INET
第二個參數:指定套接字的類型在1.1版本中指定指定兩種一SOCK_STREAM流式套接字和SOCK_DREAM數據報套接字
第三個參數:指示所要使用的的協議,如果為0則自動選擇合適的協議(推薦)
2. 綁定套接字
bind(socketSrc, (SOCKADDR*)&addsrc, sizeof(SOCKADDR));
第一個參數:一個未綁定的的套接字
第二個參數:通過一個SOCKADDR結構體將一個地址分配給套接字
第三個參數:第二個參數的大小長度
SOCKADDR結構體: struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
第一個成員:sin_family地址族(這個參數不使用網路位元組序列,其他參數都是網路位元組序列)
第二個成員:sin_port指定要綁定的埠使用htons來轉換成網路位元組序列因為是無符號短整型
第三個成員:in_addr的結構體用來存放地址in_addr的結構如下
struct in_addr {
union {
struct S_un_b;
struct S_un_w;
u_long S_addr;
} S_un;
};
可以看出in_addr是一個包含一個聯合體的結構體,聯合體可以用來存放不同類型的數據但只存放一個數據,根據選擇不同而不同,我們的程序中選擇的是長整型的變數S_addr來存放一個地址需用htonl來轉換成為網路位元組序;
l htonl和htons區別是在於一個是將一個32位的主機位元組序列轉換成32位的TCP/IP的網路位元組序一個則是16位
l inet_addr的用處是將一個點分制的IP地址字元串轉換為一個合適的 in_addr的變數。
l inet_ntoa將一個網路地址轉換為標準的點分式地址格式的字元串
3. 監聽套接字:
listen(socketSrc, 5); //listen用於將一個已綁定但未連接的套接字對象設定成監聽模式等 到一個即將到來的連接
第二個參數:表示等待連接的最大長度,如果參數被設置為SOMAXCONN將被設成一個最大的可能值
4. 接受連接:
在一個被設置為監聽的套接字上允許一個連接,並返回一個已連接的新的套接字
SOCKET socketconn = accept(socketSrc, (SOCKADDR*)&addclient, &len);
第一個參數:一個被設置為監聽狀態的套接字;
第二個參數:一個SOCKADDR結構體用於保存請求連接的實體的地址,根據地址族的不同所創建的結構體不一樣
第三個參數:存儲地址的長度,此參數在調用accept函數前必須初始化,否則會導致調用失敗
5. 完成以上工作後通過recv和send函數來接收和發送數據
recv(socketconn, recvbuf, 100, 0);
第一個參數是一個已連接的套接字
第二個參數是用來存儲接收的數據的緩沖區地址
第三個參數表示緩沖區的大小
第四個參數指示接收的模式此處設為0
客戶端的編寫
6. 首先也是創建套接字
7. 然後在建立連接
connect(sockclient, (SOCKADDR*)&addsrc, sizeof(SOCKADDR));
第二個參數是要連接的地址,第三個參數則是地址的大小

UDP編程部分在簡單的多線程聊天室的編寫中詳細說明
他是基於無連接的協議
所以編寫伺服器端時只要綁定了套接字後就可以開始傳送和接受數據,而客戶端則只需創建套接字就可以開始傳送和接收
同過 recvfrom和sendto函數來操作

使用closesocket(m_socket);關閉一個套接字,使用WSACleanup();來釋放套接字型檔

希望對你有幫助呵呵 這是在VC下的

linux編譯bind軟體出錯,是bug么

首先問一句,
是在哪個版本的系統上編輯的哪個版本的bind
可以查一下你編輯的當前bind版本對系統的要求,確認一下你的系統是否在支持的范圍內。

④ 電腦中的 bind()錯誤是什麼

Berkeley Internert Name Domain(BIND)是我們所熟知的域名軟體,它具有廣泛的使用基礎,Internet上的絕大多數 Py`<W
DNS伺服器都是基於這個軟體的。BIND目前由ISC(Internet Software Consortium)負責維護,具體的開發由 7! J"|RRH*
Nominum(www.nominum.com)公司來完成。下面編譯的這個常見問題集就是由該公司所發布的(同時也見於 @W(6pyQd
http://www.isc.org/bind),可以說,它具有較強的針對性和實用性。 V;gkSh*^i
1) 哪裡可以找到BIND? j 9|KD
BIND以源碼的格式發布。當前的版本為BIND 9,不過BIND 8.2.2-P5仍然是廣泛發布的版本。考慮到早期版本的安全問 FGX G7vl
題,如果您還在運行比8.2.2-P5更早的版本,那麼我們強烈推薦您升級軟體。 RB2/TwDZ%
以下的URL包括了源碼和其他相關資源的鏈接,你可能會覺得很有用處: &]L~(kL
http://www.isc.org/procts/BIND/ I4o^<P+
源碼也可以使用ftp從ftp://ftp.isc.org/isc/bind/src/8.2.2-P5/bind-src.tar.gz 獲得。 'f Vw$0W
鏡像BIND的ftp伺服器列表和其它ISC維護的開發源碼軟體可以在ftp://ftp.isc.org/isc/MIRRORS上找到。 `1N.=W
2) 怎樣安裝BIND? l.%B,bUg
下載源碼到一個空的目錄。如果你需要的話,你也可以下載文檔和捆綁的包。 OqOA*AnNK[
接下來,你需要解壓(unzip)和解包(untar)發布的包。 <n1],wY
gunzip < bind-src.tar.gz | tar xf - w0_x\
然後,你需要編譯和安裝軟體。常見src/INSTALL以獲知指令。在安裝之前請備份系統,因為安裝可能會覆蓋舊的二進制 a_$ Xi
代碼;這是依賴於系統的。 W"$w57
如果你是從BIND 4轉過來的,那麼你需要將配置文件named.boot轉成新的語法。這里包含了一個轉換程序。 Q-! |C
named-bootconf }(y
< /etc/named.boot w1'SM}J%
> /etc/named.conf 9JEC+]6
同時,如果你正從BIND 4轉換而來,那麼系統啟動腳本需要進行修改,以使之查找/etc/named.conf,而不是 z$Tk?0*a
/etc/named.boot。 f o+-<s
接著,你需要終止老的named並啟動新的。 TD:^&o+
kill -TERM tF /[A-
ndc start [#yE)| Q
檢查系統日誌(在大多數Unix系統上,錯誤都存放在/var/adm/messages中),因為當前的版本比先前的版本容錯性會差 g^|3;F2j
一些。 cw%V0r
3) 哪裡有基於NT的BIND? {}x.lWT-
最新的基於NT的BIND可以從ftp://ftp.isc.org/isc/bind/src/8.2.2-P5/bind-src.tar.gz上的8.2.2p5源碼中找 R zsW2.& 
到。你應該能夠使用WinZip來解壓/解包8.2.2p5文件。一旦解壓了源碼,你會在src/port/winnt目錄下找到NT的移植程 ]NcAW6"
序。你需要Visual C++ 6.0來編譯它。 lyh=!F*X4
4) 哪裡可以找到有關BIND的信息? l;,wcUi
先從http://www.isc.org/procts/BIND/開始。 DA #S
對於BIND用戶,有一個可用的郵件列表。使用http://www.isc.org/services/public/lists/bind-lists.html上的表 sw*ryaPHw
單訂閱。在你提交你的問題到郵件列表之前,請檢查郵件列表的檔案以查看是否你的問題已經回答過了。可搜索的 gPoZfV
bind-users郵件列表檔案位於http://www.isc.org/ml-archives/bind-users/。 p6ba)>r
Bind-users郵件列表同時指向了中等的Usenet新聞組comp.protocols.dns.bin.你可以在http://www.deja.com/上搜 <SjBK\.>
索該新聞組。 )6=~|6c^
BIND的"聖經"是DNS and BIND,Third Edition,作者:Paul Albitz和Cricket Liu。 - ]*R[}a8p
5) 為什麼我應該升級BIND到最新的版本? b>NV)
最新的BIND版本解決了在以前版本中發現的bug和/或安全漏洞。 V)]OHyC6{
6) 我現在使用的是BIND的什麼版本? ohF8Rfr/2
有幾種方法可用來確定你正在使用什麼版本的BIND。請注意有一些是針對於特定操作系統的,而其它一些不能在早於 b>\F K
4.9.5的BIND版本上工作。我們會在下面的描述中指明這些限制。 5pB5KCV
● 最簡單的告知版本號的方法是查找named啟動時寫到系統日誌文件中的消息。例如: #I Q1
Jul 14 12:54:21 ns named[15677]: starting. named 8.2.2-P5 !\cM,+6R
Jul 14 12:54:21 [email protected]:/usr/sbin/named C<ruBa9Z
● named帶"-v"開關會顯示版本: 0Hq N[ @
# named -v ''dfa<5%I
named 8.2.2-P5 Thu Jul 20 17:19:57 PDT 2000 g-qJi ~6#
[email protected]:/usr/sbin/named ;lM _
● 當使用更新版本的BIND時,BIND的name後台守護程序的控制介面程序可以提供版本信息: *${\w`H
ndc status (+-S_A(o
● 源代碼控制系統(SCSS)的"what"命令提供了文件的標示信息。 Bh(iA\/
what /named e5r8_50ut|
以下命令當在運行BIND 4.9.5及以上版本的伺服器上檢查時會起作用。這兩個程序都包括在BIND的發布版本中。 "$CYOoa
●nslookup _|h1 
# nslookup h;*Hd>W>_
Default Server: ns.yourco.bogus (?j47Ts
Address: 333.333.333.333 _K)pf
> set class=chaos ve;qLn/o
> set type=txt ;["?u S
> version.bind @c.rC090
Server: ns.yourco.bogus "^L%]
Address: 333.333.333.333 i3ovFUs(
VERSION.BIND text = "8.2.2-P5" x]OiQL%jz
〉 cf1V^v3
●dig :.hnR&>r;
dig version.bind txt chaos @ server name z$X1,h.\U
或者 W*1?87<'r
dig @ server name txt chaos version.bind  ^f$7t
7) 我得到一個錯誤提示:No default TTL set using SOA minimum instead.為什麼會這樣?怎麼辦? D3rJ0m7[
從BIND 8.2開始,你需要一條$TTL指示來設置域的默認TTL。可在域的SOA記錄之前添加一條'$TTL XXXXXX'指示。 .X Xv2R
(XXXXXX表示計算到秒的默認TTL.) ..s6$i#@
8) 主機名可使用哪些有效字元? IG/*CJ}@
主機名可以包括字母,數字以及連字元,但不能以連字元開頭。下劃線(_)在主機名中不是有效的字元。盡管有一些DNS ^b{ 
服務軟體包可以允許下劃線在主機名中出現,但大多數是不行的。使用一個帶有下劃線的域或者主機名會導致大多數 @em=?gla
Internet上的名字伺服器不能識別相關的主機/IP地址。 s5Av"Jy:k
9) 為什麼當我在本域中的一台主機上使用nslookup時會得到non-authoritative的答復? Q*z"m |
這通常發生在域(zone)文件中有錯誤出現的時候。檢查系統日誌文件'messages'以查證錯誤。 GtZ(rVA0F/
10) 我已經修改了自己的域,但是在Internet上的其它地方看不到這種改變,為什麼? nE8IaTpT
每當你修改了你的域文件,例如當你添加或者修改了主機記錄的時候,你也必須更新域的SOA記錄的文件版本,或者是 ]Bl.m:vMc
"serial number",因為名字伺服器從你的伺服器檢索信息時需要知道發生了修改。如果從上次查詢之後版本號沒有修 q6BW*<
改,就不會執行更新。舉例如下: Dl6]iB
; foo.com. DuB;X\E`{
$TTL 14400 |6p ^Gz.H,
@ IN SOA o.8J#XJP*
someplace.foo.com. admin.foo.com. ( K$i<D) c
1 ; this file's version -- change I2NfG ~9 J
43200 ; refresh twice a day yj~cD9:(e
1800 ; retry refresh every 15 minutes yj->X7}+'
604800 ; expire after 1000 hours (over week) Ve\2#Yh
259200 ) ; minimum TTL of 3 day t~?^o!Q
顯而易見,帶'file's version'的行是我們想要修改的。版本序號可以為任何數字;1,2,3,4或者2001,2002, ngx6}[tgV
2003,等等。唯一的限制是版本號不能多於10位。在這個示例中,如果你對域文件作了修改,你需要將版本序號改為 TSBSfc4zu
'2'。 $g_TCdN%
11) 為什麼沒有IP地址? ((${Ea1
在/etc/resolv.conf中沒有名字伺服器記錄。 4o _G ,/G_
12) 在我的日誌文件中出現的"lame server"錯誤是什麼? Aa]0IY'7jp
"lame server"指的是不能確信其是否具有域的授權的伺服器。如果你有lame server,或者是授權給了lame server的 I<zvq!Z)
域,那麼"lame server"消息很有用。如果你寧願不看到"lame server"消息,你可以使用logging語句丟棄它們: YbA ]9uB
logging { X TDb R]
category lame-servers{ null; }; $=?:-f5 
}; LOFv5H4I
13) Microsoft Windows 2000和BIND的關系怎樣? MFY813 `
BIND默認會檢查所有記錄以確保只在需要主機名的地方使用了主機名,這能夠防止意外的一致性問題。 <;+\&u7x*
Microsoft Windows 2000使用一個稱為"_msdcs"來存放動態目錄數據。盡管這種子域不會與合法的主機名產生不一致, p\9x[9:iR1
但是也使得在子域中存放非法的主機名成為可能。這種主機名的使用默認是被BIND拒絕的。 @YS osEk}
動態目錄希望在_msdcs中有"全局目錄(global catalog)"(例如,gc._msdcs.example.com),這默認是拒絕的。為了解 Q/&"5rvC
決此問題,我們推薦動態目錄設為獨立的域(例如,"_msdcs.example.com")並配置成不檢查非法的主機名。這應該是合理 -'Z ~(su
的,因為Window 2000伺服器創建這些數據,而且不應該會與其它希望訪問這些數據的Windows 2000機器產生不一致問 iIaj )ihQI
題。 })7p M`a
例如, WI:kRt1
zone "_msdcs.example.com" { >x=?UPe8
type master; }26- @:
file "_msdcs.example.db"; JCbt$6Tv
check-names ignore; @eaD5'$bt)
allow-update { localnets; }; ec?mz?
}; sU QfN{:
14) 什麼是TSIG key? (+5m(CvN
TSIG key提供了一種鑒別和驗證交換的DNS數據有效性的方法,它在解析器和伺服器之間或者兩台伺服器之間使用一個密  cy_*
鑰。 Z lY<!
15) 我怎樣使用TSIG key來動態更新我的DNS? 1vB(T!9%
首先你需要使用以下命令生成一個TSIG密鑰(我們將使用tsig-key作為密鑰文件名): (+zhM'Z
dnskeygen -H 128 -h -n tsig-key。 Vh#X8 S 4
這會生成一對密鑰文件: AvU =D$a
'Ktsig-key.+157+00000.key',這是一個ASCII文件,它包括以下行: YML|F;
tsig-key. IN KEY 513 3 157 <$u32YI H.
awwLOtRfpGE+rRKF2+DEiw== t 9 O;*rv
和 rmbW3!bh
'Kvip-key.+157+00000.private' ,這包括: N&-tX$iLa5
Private-key-format: v1.2 Algorithm: 157 (HMAC) .bkk{&*{
Key: awwLOtRfpGE+rRKF2+DEiw== i5:W'g1b?
你將需要獲取base64編碼的密鑰awwLOtRfpGE+rRKF2+DEiw== 並在配置你的伺服器命名設置中使用它。例如: J,6Ir/f"b
key tsig-key. { algorithm hmac-md5; secret "awwLOtRfpGE+rRKF2+DEiw=="; }; rkn#b:Dxq
zone "ddns.dregis.com" { 3K|*Bd()t
... 0z]o0= {
... l40iikt
allow-update { key tsig-key. ; }; ImBFtHXYo
} kJVcF)
記得在這之後重啟named。 UEPu;.#=Q
然後,你需要復制這兩個密鑰文件到客戶系統的某個位置(例如使用/var/named/tsig)。最後,你需要運行以下命令: dC*\GwP
nsupdate -k /var/named/tsig:tsig-key。 FCr\
16) 在named.conf中的'forwarder'選項有何作用? EKH!_!
forwarder行告訴伺服器轉發所有查詢,因為它對另一個域名伺服器沒有授權或緩沖的數據。

⑤ windows socket 編程:bind 錯誤碼-1 如何解決

參考下面:

SOCKET server_socket;
SOCKADDR_IN internet_addr;
int ret, error, addr_len;
PROXY_SOCK_PARAM_T *_param;

HANDLE hThread;
unsigned int thid;

// 創建 socket
server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(server_socket == INVALID_SOCKET) /* 調用 socket 不成功, 返回 INVALID_SOCKET,
調用 WSAGetLastError() 可查看錯誤代碼 */
{
error = WSAGetLastError();
// TODO: 錯誤處理
return 0;
}

// 進行 Socket 綁定
internet_addr.sin_family = PF_INET;
internet_addr.sin_port = htons(PROXY_SERVER_PORT);
internet_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(server_socket, (SOCKADDR *)&internet_addr, sizeof(internet_addr));
if(ret != 0) /* bind 成功返回 0. 否則返回 SOCKET_ERROR, 調用 WSAGetLastError() 可查看錯誤代碼 */
{
error = WSAGetLastError();
closesocket(server_socket);
// TODO: 錯誤處理
return 0;
}

// 在 socket 上進行監聽
ret = listen(server_socket, 128); /* listen 成功返回 0. 否則返回 SOCKET_ERROR,
調用 WSAGetLastError() 可查看錯誤代碼 */
if(ret != 0)
{
error = WSAGetLastError();
closesocket(server_socket);
// TODO: 錯誤處理
return 0;
}
std::cout << "[PROXY-SERVR] 埠 5200 監聽啟動..." << std::endl;
// 接收來自客戶端的請求
for(;;)
{
// 組織傳遞給新線程的數據結構
_param = (PROXY_SOCK_PARAM_T *)malloc(sizeof(PROXY_SOCK_PARAM_T));
_param->server_socket = server_socket;
addr_len = sizeof(_param->client_addr);
_param->client_socket = accept( _param->server_socket,
(SOCKADDR *)&(_param->client_addr),
&(addr_len));

if(_param->client_socket == INVALID_SOCKET)
{
error = WSAGetLastError();
// TODO: 錯誤處理
} else {
// 創建工作線程
hThread = (HANDLE)_beginthreadex(NULL, 0, server_work_thread, (void *)_param, 0, &thid);
if(hThread == INVALID_HANDLE_VALUE)
{
free(_param);
} else {
CloseHandle(hThread);
}
}
}

⑥ yum安裝bind出現如圖錯誤是什麼原因

yum文件寫錯了

⑦ bind函數調用失敗,為什麼

要麼就是參數類型出錯了,要麼就是調用環境出錯了,也就是在調用bind函數前可能先需要調用其他的函數去做一些處理,而你沒有做這一步

⑧ 埠沒被佔用,怎麼會bind失敗

會拋出埠被佔用的異常,BindException,會提示你Address already in use
你可以捕捉這個異常,然後更改自己的埠
或者直接使用0埠,這恭緝多墾鼙舊俄馴藩沫樣系統會分配一個沒被使用的最小埠

⑨ bind 9 DNS源碼編譯問題,DNS數據包異常檢測,DNS開發

另外,TCP/IP設置最容易引起不能瀏覽網頁的情況,一般設置為自動獲得IP地址,但是DNS一定要填寫。其他採用默認即可 四,ADSL Modem同步異常問題 檢查一下自己

⑩ bind失敗的原因是什麼

WSAAPI用於定義函數的調用方式,其WSAAPI的宏定義為#define WSAAPI FAR PASCAL,這種宏一般是相當於WINAPI之類的宏,用來指定調用方式的,比如堆棧如何安排之類的,忽略就好了

閱讀全文

與bind導致編譯失敗相關的資料

熱點內容
長沙社保是什麼app 瀏覽:860
單片機的位定址 瀏覽:851
伺服器怎麼設置內網穿透 瀏覽:753
pdf轉jpg工具注冊碼 瀏覽:409
php上傳進度百分比 瀏覽:923
江蘇伺服器陣列卡驅動雲主機 瀏覽:416
魔獸世界怎麼切換回伺服器 瀏覽:226
如何使用java編程 瀏覽:191
win8c語言編程軟體 瀏覽:407
cc是程序員必須學會的語言嗎 瀏覽:594
廣東源碼論壇小程序 瀏覽:423
美團打車什麼時候出的APP 瀏覽:370
chromejava插件安裝 瀏覽:374
帥氣牛仔用什麼app 瀏覽:503
伺服器read卡怎麼查看型號 瀏覽:706
zcat命令 瀏覽:112
單片機程序案例 瀏覽:123
透傳程序員 瀏覽:749
java連接字元串數組 瀏覽:752
無法連接到版本伺服器是什麼原因 瀏覽:476