當前位置:首頁 » 操作系統 » linuxsocket失敗

linuxsocket失敗

發布時間: 2022-11-21 06:29:24

linux下socket編程總是bind異常.求教

出現這種情況,調用使用perror("bind");把錯誤原因打出來,再根據具體原因查查,錯誤原因列表,極有可能是埠被佔用,或者是許可權問題,你用一個大於1024的埠試試吧。

② linux socket 求助,總是提示 Connection refused

有時候,寫UDP socket程序的時候,在調用sendto或者recvfrom的時候,會發現有Connection refused錯誤返回,錯誤碼是ECONNREFUSED。對於懂得socket介面但是不很很懂網路的人,可能這根本就不是個問題,他會根據錯誤碼知道遠端沒有這個服務埠,正如socket api的man手冊中描述的那樣: ECONNREFUSED A remote host refused to allow the network connection (typically because it is not running the requested service). 有時候無知真的是一種幸福!但是如果你十分精通TCP/IP棧,那麼就想不通了,UDP既然無連接,怎麼知道遠端的情況呢?UDP不正如協議標准描述的那樣,發出去就不管了嗎?對於接收,沒有數據就一直等,如果設置了NOWAIT,則直接返回EAGAIN,表示稍後再試。不管怎麼說,也不會有ECONNREFUSED這么詳細的信息返回才對啊。 既然UDP不會從對端返回任何錯誤信息,那麼一定有別的什麼返回了,總不能憑空猜測啊。這就涉及到了網路協議設計中的數據平面和控制平面了,對於控制平面的消息,可以是帶內傳輸,也可以是帶外傳輸。對於TCP而言,無疑是帶內傳輸的,因為它本身就是有連接的協議,協議本身會處理任何的錯誤和異常,然而對於UDP而言,因為其設計目的就是保持簡單性,故不再附帶有任何帶內的控制消息邏輯,互聯網上為了彌補這一類協議的控制邏輯的缺失,ICMP協議才顯得尤為重要!實際上,ICMP,根據名稱就可以看出它是一種專門的控制協議,控制和指示IP層發生的事件。 ECONNREFUSED正是ICMP返回的!

③ linux socket connect錯誤:[115][Operation now in progress]

參考答案: 當你感到悲哀痛苦時,最好是去學些什麼東西。學習會使你永遠立於不敗之地。

④ 下面是socket編程通信 linux下的 老是失敗 高手請進。求指教

server_addr.sin_family = AF_INET; // 指定協議族
server_addr.s_addr=inet_addr("10.1.33.4"); // 要轉換
server_addr.sin_port = htons(5000); // 要轉換位元組序

if((sd=socket(AF_INET,SOCK_STREAM,0))<0) // 要多加個括弧
sprintf(stderr, "error in socket, error code : %d error string: %s\n", errno, strerror(errno));

查看失敗原因,可以通過頭文件 include <errno.h>
然後列印errno (全局變數,整型,錯誤碼)
strerror(errno) (全局函數,返回字元串,說明錯誤原因)
例子在上面

⑤ linux下socket編譯時出現綁定錯誤

教你個調試方法,你把printf("bind error");換成printf("bind error: %s\n", strerror(errno)); 這樣可以看出哪裡出錯了.

我沒猜錯的話錯誤信息應該是"Address already in use." ,如果是這個錯誤的話,你再等一會從新運行server就可以了.

⑥ linux socket 連接超時 怎麼解決

今天發現自己的系統存在很嚴重缺陷,當前台關閉的時候後台就無法正常工作,原因很好定位,後台的socket連接超時時間過長,系統默認時間好像是75秒,於是找資料,根據下邊文章中的內容解決了,把超時時間設為5秒後,感覺好多了。看來還有好多東西需要慢慢挖掘阿!

如何設置socket的Connect超時(linux)
[From]http://dev.cbw.com/c/c/200510195601_4292587.shtml
1.首先將標志位設為Non-blocking模式,准備在非阻塞模式下調用connect函數
2.調用connect,正常情況下,因為TCP三次握手需要一些時間;而非阻塞調用只要不能立即完成就會返回錯誤,所以這里會返回EINPROGRESS,表示在建立連接但還沒有完成。
3.在讀套介面描述符集(fd_set rset)和寫套介面描述符集(fd_set wset)中將當前套介面置位(用FD_ZERO()、FD_SET()宏),並設置好超時時間(struct timeval *timeout)
4.調用select( socket, &rset, &wset, NULL, timeout )
返回0表示connect超時
如果你設置的超時時間大於75秒就沒有必要這樣做了,因為內核中對connect有超時限制就是75秒。

[From]http://www.ycgczj.com.cn/34733.html
網路編程中socket的分量我想大家都很清楚了,socket也就是套介面,在套介面編程中,提到超時的概念,我們一下子就能想到3個:發送超時,接收超時,以及select超時(註: select函數並不是只用於套介面的,但是套介面編程中用的比較多),在connect到目標主機的時候,這個超時是不由我們來設置的。不過正常情況下這個超時都很長,並且connect又是一個阻塞方法,一個主機不能連接,等著connect返回還能忍受,你的程序要是要試圖連接多個主機,恐怕遇到多個不能連接的主機的時候,會塞得你受不了的。我也廢話少說,先說說我的方法,如果你覺得你已掌握這種方法,你就不用再看下去了,如果你還不了解,我願意與你分享。本文是已在Linux下的程序為例子,不過拿到Windows中方法也是一樣,無非是換幾個函數名字罷了。
Linux中要給connect設置超時,應該是有兩種方法的。一種是該系統的一些參數,這個方法我不講,因為我講不清楚:P,它也不是編程實現的。另外一種方法就是變相的實現connect的超時,我要講的就是這個方法,原理上是這樣的:
1.建立socket
2.將該socket設置為非阻塞模式
3.調用connect()
4.使用select()檢查該socket描述符是否可寫(注意,是可寫)
5.根據select()返回的結果判斷connect()結果
6.將socket設置為阻塞模式(如果你的程序不需要用阻塞模式的,這步就省了,不過一般情況下都是用阻塞模式的,這樣也容易管理)
如果你對網路編程很熟悉的話,其實我一說出這個過程你就知道怎麼寫你的程序了,下面給出我寫的一段程序,僅供參考。
/******************************
* Time out for connect()
* Write by Kerl W
******************************/
#include <sys/socket.h>
#include <sys/types.h>
#define TIME_OUT_TIME 20 //connect超時時間20秒
int main(int argc , char **argv)
{
………………
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) exit(1);
struct sockaddr_in serv_addr;
………//以伺服器地址填充結構serv_addr
int error=-1, len;
len = sizeof(int);
timeval tm;
fd_set set;
unsigned long ul = 1;
ioctl(sockfd, FIONBIO, &ul); //設置為非阻塞模式
bool ret = false;
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
{
tm.tv_set = TIME_OUT_TIME;
tm.tv_uset = 0;
FD_ZERO(&set);
FD_SET(sockfd, &set);
if( select(sockfd+1, NULL, &set, NULL, &tm) > 0)
{
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
if(error == 0) ret = true;
else ret = false;
} else ret = false;
}
else ret = true;
ul = 0;
ioctl(sockfd, FIONBIO, &ul); //設置為阻塞模式
if(!ret)
{
close( sockfd );
fprintf(stderr , "Cannot Connect the server!n");
return;
}
fprintf( stderr , "Connected!n");
//下面還可以進行發包收包操作
……………
}
以上代碼片段,僅供參考,也是為初學者提供一些提示,主要用到的幾個函數,select, ioctl, getsockopt都可以找到相關資料,具體用法我這里就不贅述了,你只需要在linux中輕輕的敲一個man <函數名>就能夠看到它的用法。
此外我需要說明的幾點是,雖然我們用ioctl把套介面設置為非阻塞模式,不過select本身是阻塞的,阻塞的時間就是其超時的時間由調用select 的時候的最後一個參數timeval類型的變數指針指向的timeval結構變數來決定的,timeval結構由一個表示秒數的和一個表示微秒數(long類型)的成員組成,一般我們設置了秒數就行了,把微妙數設為0(註:1秒等於100萬微秒)。而select函數另一個值得一提的參數就是上面我們用到的fd_set類型的變數指針。調用之前,這個變數裡面存了要用select來檢查的描述符,調用之後,針對上面的程序這裡面是可寫的描述符,我們可以用宏FD_ISSET來檢查某個描述符是否在其中。由於我這里只有一個套介面描述符,我就沒有使用FD_ISSET宏來檢查調用select之後這個sockfd是否在set裡面,其實是需要加上這個判斷的。不過我用了getsockopt來檢查,這樣才可以判斷出這個套介面是否是真的連接上了,因為我們只是變相的用select來檢查它是否連接上了,實際上select檢查的是它是否可寫,而對於可寫,是針對以下三種條件任一條件滿足時都表示可寫的:
1)套介面發送緩沖區中的可用控制項位元組數大於等於套介面發送緩沖區低潮限度的當前值,且或者i)套介面已連接,或者ii)套介面不要求連接(UDP方式的)
2)連接的寫這一半關閉。
3)有一個套介面錯誤待處理。
這樣,我們就需要用getsockopt函數來獲取套介面目前的一些信息來判斷是否真的是連接上了,沒有連接上的時候還能給出發生了什麼錯誤,當然我程序中並沒有標出那麼多狀態,只是簡單的表示可連接/不可連接。
下面我來談談對這個程序測試的結果。我針對3種情形做了測試:
1. 目標機器網路正常的情況
可以連接到目標主機,並能成功以阻塞方式進行發包收包作業。
2. 目標機器網路斷開的情況
在等待設置的超時時間(上面的程序中為20秒)後,顯示目標主機不能連接。
3. 程序運行前斷開目標機器網路,超時時間內,恢復目標機器的網路
在恢復目標主機網路連接之前,程序一隻等待,恢復目標主機後,程序顯示連接目標主機成功,並能成功以阻塞方式進行發包收包作業。
以上各種情況的測試結果表明,這種設置connect超時的方法是完全可行的。我自己是把這種設置了超時的connect封裝到了自己的類庫,用在一套監控系統中,到目前為止,運行還算正常。這種編程實現的connect超時比起修改系統參數的那種方法的有點就在於它只用於你的程序之中而不影響系統。

⑦ 在線求助,linux 網路socket 高密度send 發送失敗

在linux的網路編程,特別是TCP的編程中,SIGPIPE信號錯誤是一個比較常見的問題,我猜測你是在使用TCP的socket吧,如果是這樣的話,很有可能是你在向一個已經處於關閉狀態的socket寫數據,因為TCP是面向連接的協議。如果對方將socket給close掉了,而你還繼續往這個 socket寫數據,就會觸發這個信號。 因此,建議你在write之前檢查一下對方是否已經close掉了這個socket。 如果回答得不對,可以繼續追問哈

⑧ linux連接mysql報錯,socket connect失敗

PHP沒配置對
錯誤代碼的大意是:最高錯誤:不能調用未找到的函數mysql_connect()
如果是資料庫未鏈接成功的話 $a 應該返回 false

⑨ linux socket 求助,總是提示 Connection refused

1. 首先那個要加上listen,listen會把socket創建的套接字從CLOSE狀態,轉換到LISTEN狀態
2. err = bind(server_socket, (sockaddr*)&server_addr, sizeof(server_addr));這里強制轉換為什麼可以直接用sockaddr *呢,不應該是struct sockaddr *呢?
3. server_addr.sin_addr.s_addr = inet_addr(SERVER_IP)這里最好還是用inet_pton吧
4.
err = connect(s,(sockaddr*)&server_addr, sizeof(sockaddr));這句你仔細看看,最後一個sizeof裡面的東西。改改差不多了應該,怎麼能編譯不報錯呢,編譯的時候加上-Wall試試

⑩ linux socket的accept失敗,errno=24(Too many open files)

你的程序寫的可能不是太好,打開太多文件,超過系統設定了
當然,也有可能你的需求就是要打開很多,那麼修改系統限制,如下參數可供參考:
1 編輯/etc/sysctl.conf,增加
net.core.somaxconn=131072fs.file-max=131072
然後 sudo sysctl -p
2 修改/usr/include/linux/limits.h,其中NR_OPEN改成
NR_OPEN = 65536
3 編輯/etc/security/limits.conf,增加
* soft nofile 65535* hard nofile 65535

熱點內容
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:727
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:797
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:504
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:365
ef資料庫查詢數據 發布:2025-05-18 03:29:36 瀏覽:668
百度雲下載文件夾 發布:2025-05-18 03:17:33 瀏覽:674
php雲開發 發布:2025-05-18 03:12:41 瀏覽:447
sql語句顯示表 發布:2025-05-18 03:12:30 瀏覽:690
資料庫系統的例子 發布:2025-05-18 03:02:42 瀏覽:191
數字化儲存與編譯是什麼 發布:2025-05-18 02:56:55 瀏覽:217