真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

關(guān)于linux創(chuàng)建tcp命令的信息

linux下怎么設(shè)置tcp

Socket的send函數(shù)在執(zhí)行時報EAGAIN的錯誤當(dāng)客戶通過Socket提供的send函數(shù)發(fā)送大的數(shù)據(jù)包時,就可能返回一個EGGAIN的錯誤。該錯誤產(chǎn)生的原因是由于send 函數(shù)中的size變量大小超過了tcp_sendspace的值。tcp_sendspace定義了應(yīng)用在調(diào)用send之前能夠在kernel中緩存的數(shù)據(jù)量。當(dāng)應(yīng)用程序在socket中設(shè)置了O_NDELAY或者O_NONBLOCK屬性后,如果發(fā)送緩存被占滿,send就會返回EAGAIN的錯誤。 為了消除該錯誤,有三種方法可以選擇: 1.調(diào)大tcp_sendspace,使之大于send中的size參數(shù) ---no -p -o tcp_sendspace=65536 2.在調(diào)用send前,在setsockopt函數(shù)中為SNDBUF設(shè)置更大的值 3.使用write替代send,因為write沒有設(shè)置O_NDELAY或者O_NONBLOCK1. tcp 收發(fā)緩沖區(qū)默認值 [root@qljt core]# cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 416153687380 :tcp接收緩沖區(qū)的默認值[root@qljt core]# cat /proc/sys/net/ipv4/tcp_wmem 4096 16384 416153616384 : tcp 發(fā)送緩沖區(qū)的默認值2. tcp 或udp收發(fā)緩沖區(qū)最大值[root@qljt core]# cat /proc/sys/net/core/rmem_max 131071131071:tcp 或 udp 接收緩沖區(qū)最大可設(shè)置值的一半。也就是說調(diào)用 setsockopt(s, SOL_SOCKET, SO_RCVBUF, rcv_size, optlen); 時rcv_size 如果超過 131071,那么getsockopt(s, SOL_SOCKET, SO_RCVBUF, rcv_size, optlen); 去到的值就等于 131071 * 2 = 262142[root@qljt core]# cat /proc/sys/net/core/wmem_max 131071131071:tcp 或 udp 發(fā)送緩沖區(qū)最大可設(shè)置值得一半。跟上面同一個道理3. udp收發(fā)緩沖區(qū)默認值[root@qljt core]# cat /proc/sys/net/core/rmem_default 111616:udp接收緩沖區(qū)的默認值[root@qljt core]# cat /proc/sys/net/core/wmem_default 111616111616:udp發(fā)送緩沖區(qū)的默認值. tcp 或udp收發(fā)緩沖區(qū)最小值tcp 或udp接收緩沖區(qū)的最小值為 256 bytes,由內(nèi)核的宏決定;tcp 或udp發(fā)送緩沖區(qū)的最小值為 2048 bytes,由內(nèi)核的宏決定setsockopt設(shè)置socket狀態(tài) 1.closesocket(一般不會立即關(guān)閉而經(jīng)歷TIME_WAIT的過程)后想繼續(xù)重用該socket: BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)bReuseaddr,sizeof(BOOL));2. 如果要已經(jīng)處于連接狀態(tài)的soket在調(diào)用closesocket后強制關(guān)閉,不經(jīng)歷TIME_WAIT的過程: BOOL bDontLinger = FALSE; setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)bDontLinger,sizeof(BOOL));3.在send(),recv()過程中有時由于網(wǎng)絡(luò)狀況等原因,發(fā)收不能預(yù)期進行,而設(shè)置收發(fā)時限: int nNetTimeout=1000;//1秒 //發(fā)送時限 setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)nNetTimeout,sizeof(int)); //接收時限 setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)nNetTimeout,sizeof(int));4.在send()的時候,返回的是實際發(fā)送出去的字節(jié)(同步)或發(fā)送到socket緩沖區(qū)的字節(jié)(異步);系統(tǒng)默認的狀態(tài)發(fā)送和接收一次為8688字節(jié)(約為8.5K);在實際的過程中發(fā)送數(shù)據(jù) 和接收數(shù)據(jù)量比較大,可以設(shè)置socket緩沖區(qū),而避免了send(),recv()不斷的循環(huán)收發(fā): // 接收緩沖區(qū) int nRecvBuf=32*1024;//設(shè)置為32K setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)nRecvBuf,sizeof(int)); //發(fā)送緩沖區(qū) int nSendBuf=32*1024;//設(shè)置為32K setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)nSendBuf,sizeof(int));5. 如果在發(fā)送數(shù)據(jù)的時,希望不經(jīng)歷由系統(tǒng)緩沖區(qū)到socket緩沖區(qū)的拷貝而影響程序的性能: int nZero=0; setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)nZero,sizeof(nZero));6.同上在recv()完成上述功能(默認情況是將socket緩沖區(qū)的內(nèi)容拷貝到系統(tǒng)緩沖區(qū)): int nZero=0; setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)nZero,sizeof(int));7.一般在發(fā)送UDP數(shù)據(jù)報的時候,希望該socket發(fā)送的數(shù)據(jù)具有廣播特性: BOOL bBroadcast=TRUE; setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)bBroadcast,sizeof(BOOL));8.在client連接服務(wù)器過程中,如果處于非阻塞模式下的socket在connect()的過程中可以設(shè)置connect()延時,直到accpet()被呼叫(本函數(shù)設(shè)置只有在非阻塞的過程中有顯著的 作用,在阻塞的函數(shù)調(diào)用中作用不大) BOOL bConditionalAccept=TRUE; setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)bConditionalAccept,sizeof(BOOL));9.如果在發(fā)送數(shù)據(jù)的過程中(send()沒有完成,還有數(shù)據(jù)沒發(fā)送)而調(diào)用了closesocket(),以前我們一般采取的措施是"從容關(guān)閉"shutdown(s,SD_BOTH),但是數(shù)據(jù)是肯定丟失了,如何設(shè)置讓程序滿足具體應(yīng)用的要求(即讓沒發(fā)完的數(shù)據(jù)發(fā)送出去后在關(guān)閉socket)? struct linger { u_short l_onoff; u_short l_linger; }; linger m_sLinger; m_sLinger.l_onoff=1;//(在closesocket()調(diào)用,但是還有數(shù)據(jù)沒發(fā)送完畢的時候容許逗留) // 如果m_sLinger.l_onoff=0;則功能和2.)作用相同; m_sLinger.l_linger=5;//(容許逗留的時間為5秒) setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)m_sLinger,sizeof(linger));設(shè)置套接口的選項。#include winsock.hint PASCAL FAR setsockopt( SOCKET s, int level, int optname,const char FAR* optval, int optlen);s:標識一個套接口的描述字。level:選項定義的層次;目前僅支持SOL_SOCKET和IPPROTO_TCP層次。optname:需設(shè)置的選項。optval:指針,指向存放選項值的緩沖區(qū)。optlen:optval緩沖區(qū)的長度。 注釋: setsockopt()函數(shù)用于任意類型、任意狀態(tài)套接口的設(shè)置選項值。盡管在不同協(xié)議層上存在選項,但本函數(shù)僅定義了最高的“套接口”層次上的選項。選項影響套接口的操作,諸如加急數(shù)據(jù)是否在普通數(shù)據(jù)流中接收,廣播數(shù)據(jù)是否可以從套接口發(fā)送等等。有兩種套接口的選項:一種是布爾型選項,允許或禁止一種特性;另一種是整形或結(jié)構(gòu)選項。允許一個布爾型選項,則將optval指向非零整形數(shù);禁止一個選項optval指向一個等于零的整形數(shù)。對于布爾型選項,optlen應(yīng)等于sizeof(int);對其他選項,optval指向包含所需選項的整形數(shù)或結(jié)構(gòu),而optlen則為整形數(shù)或結(jié)構(gòu)的長度。SO_LINGER選項用于控制下述情況的行動:套接口上有排隊的待發(fā)送數(shù)據(jù),且 closesocket()調(diào)用已執(zhí)行。參見closesocket()函數(shù)中關(guān)于SO_LINGER選項對closesocket()語義的影響。應(yīng)用程序通過創(chuàng)建一個linger結(jié)構(gòu)來設(shè)置相應(yīng)的操作特性:struct linger { int l_onoff; int l_linger;};為了允許SO_LINGER,應(yīng)用程序應(yīng)將l_onoff設(shè)為非零,將l_linger設(shè)為零或需要的超時值(以秒為單位),然后調(diào)用setsockopt()。為了允許SO_DONTLINGER(亦即禁止SO_LINGER),l_onoff應(yīng)設(shè)為零,然后調(diào)用setsockopt()。缺省條件下,一個套接口不能與一個已在使用中的本地地址捆綁(參見bind())。但有時會需要“重用”地址。因為每一個連接都由本地地址和遠端地址的組合唯一確定,所以只要遠端地址不同,兩個套接口與一個地址捆綁并無大礙。為了通知WINDOWS套接口實現(xiàn)不要因為一個地址已被一個套接口使用就不讓它與另一個套接口捆綁,應(yīng)用程序可在bind()調(diào)用前先設(shè)置SO_REUSEADDR選項。請注意僅在bind()調(diào)用時該選項才被解釋;故此無需(但也無害)將一個不會共用地址的套接口設(shè)置該選項,或者在bind()對這個或其他套接口無影響情況下設(shè)置或清除這一選項。一個應(yīng)用程序可以通過打開SO_KEEPALIVE選項,使得WINDOWS套接口實現(xiàn)在TCP連接情況下允許使用“保持活動”包。一個WINDOWS套接口實現(xiàn)并不是必需支持“保持活動”,但是如果支持的話,具體的語義將與實現(xiàn)有關(guān),應(yīng)遵守RFC1122“Internet主機要求-通訊層”中第 4.2.3.6節(jié)的規(guī)范。如果有關(guān)連接由于“保持活動”而失效,則進行中的任何對該套接口的調(diào)用都將以WSAENETRESET錯誤返回,后續(xù)的任何調(diào)用將以WSAENOTCONN錯誤返回。TCP_NODELAY選項禁止Nagle算法。Nagle算法通過將未確認的數(shù)據(jù)存入緩沖區(qū)直到蓄足一個包一起發(fā)送的方法,來減少主機發(fā)送的零碎小數(shù)據(jù)包的數(shù)目。但對于某些應(yīng)用來說,這種算法將降低系統(tǒng)性能。所以TCP_NODELAY可用來將此算法關(guān)閉。應(yīng)用程序編寫者只有在確切了解它的效果并確實需要的情況下,才設(shè)置TCP_NODELAY選項,因為設(shè)置后對網(wǎng)絡(luò)性能有明顯的負面影響。TCP_NODELAY是唯一使用IPPROTO_TCP層的選項,其他所有選項都使用SOL_SOCKET層。如果設(shè)置了SO_DEBUG選項,WINDOWS套接口供應(yīng)商被鼓勵(但不是必需)提供輸出相應(yīng)的調(diào)試信息。但產(chǎn)生調(diào)試信息的機制以及調(diào)試信息的形式已超出本規(guī)范的討論范圍。 setsockopt()支持下列選項。其中“類型”表明optval所指數(shù)據(jù)的類型。 選項 類型 意義 SO_BROADCAST BOOL 允許套接口傳送廣播信息。 SO_DEBUG BOOL 記錄調(diào)試信息。 SO_DONTLINER BOOL 不要因為數(shù)據(jù)未發(fā)送就阻塞關(guān)閉操作。設(shè)置本選項相當(dāng)于將SO_LINGER的l_onoff元素置為零。 SO_DONTROUTE BOOL 禁止選徑;直接傳送。 SO_KEEPALIVE BOOL 發(fā)送“保持活動”包。 SO_LINGER struct linger FAR* 如關(guān)閉時有未發(fā)送數(shù)據(jù),則逗留。 SO_OOBINLINE BOOL 在常規(guī)數(shù)據(jù)流中接收帶外數(shù)據(jù)。 SO_RCVBUF int 為接收確定緩沖區(qū)大小。 SO_REUSEADDR BOOL 允許套接口和一個已在使用中的地址捆綁(參見bind())。 SO_SNDBUF int 指定發(fā)送緩沖區(qū)大小。 TCP_NODELAY BOOL 禁止發(fā)送合并的Nagle算法。 setsockopt()不支持的BSD選項有: 選項名 類型 意義 SO_ACCEPTCONN BOOL 套接口在監(jiān)聽。 SO_ERROR int 獲取錯誤狀態(tài)并清除。 SO_RCVLOWAT int 接收低級水印。 SO_RCVTIMEO int 接收超時。 SO_SNDLOWAT int 發(fā)送低級水印。 SO_SNDTIMEO int 發(fā)送超時。 SO_TYPE int 套接口類型。 IP_OPTIONS 在IP頭中設(shè)置選項。 返回值:若無錯誤發(fā)生,setsockopt()返回0。否則的話,返回SOCKET_ERROR錯誤,應(yīng)用程序可通過WSAGetLastError()獲取相應(yīng)錯誤代碼。 錯誤代碼:WSANOTINITIALISED:在使用此API之前應(yīng)首先成功地調(diào)用WSAStartup()。WSAENETDOWN:WINDOWS套接口實現(xiàn)檢測到網(wǎng)絡(luò)子系統(tǒng)失效。WSAEFAULT:optval不是進程地址空間中的一個有效部分。WSAEINPROGRESS:一個阻塞的WINDOWS套接口調(diào)用正在運行中。WSAEINVAL:level值非法,或optval中的信息非法。WSAENETRESET:當(dāng)SO_KEEPALIVE設(shè)置后連接超時。WSAENOPROTOOPT:未知或不支持選項。其中,SOCK_STREAM類型的套接口不支持SO_BROADCAST選項,SOCK_DGRAM 類型的套接口不支持SO_DONTLINGER 、SO_KEEPALIVE、SO_LINGER和SO_OOBINLINE選項。WSAENOTCONN:當(dāng)設(shè)置SO_KEEPALIVE后連接被復(fù)位。WSAENOTSOCK:描述字不是一個套接口。

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)石首免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

linux tcp/ip 網(wǎng)絡(luò)通信編程

/*************************************

文件名:?server.c?

linux?下socket網(wǎng)絡(luò)編程簡例??-?服務(wù)端程序

服務(wù)器端口設(shè)為?0x8888???(端口和地址可根據(jù)實際情況更改,或者使用參數(shù)傳入)

服務(wù)器地址設(shè)為?192.168.1.104

作者:kikilizhm#163.com?(將#換為@)

*/

#include?stdlib.h

#include?sys/types.h

#include?stdio.h

#include?sys/socket.h

#include?linux/in.h

#include?string.h

int?main()

{

int?sfp,nfp;?/*?定義兩個描述符?*/

struct?sockaddr_in?s_add,c_add;

int?sin_size;

unsigned?short?portnum=0x8888;?/*?服務(wù)端使用端口?*/

printf("Hello,welcome?to?my?server?!\r\n");

sfp?=?socket(AF_INET,?SOCK_STREAM,?0);

if(-1?==?sfp)

{

printf("socket?fail?!?\r\n");

return?-1;

}

printf("socket?ok?!\r\n");

/*?填充服務(wù)器端口地址信息,以便下面使用此地址和端口監(jiān)聽?*/

bzero(s_add,sizeof(struct?sockaddr_in));

s_add.sin_family=AF_INET;

s_add.sin_addr.s_addr=htonl(INADDR_ANY);?/*?這里地址使用全0,即所有?*/

s_add.sin_port=htons(portnum);

/*?使用bind進行綁定端口?*/

if(-1?==?bind(sfp,(struct?sockaddr?*)(s_add),?sizeof(struct?sockaddr)))

{

printf("bind?fail?!\r\n");

return?-1;

}

printf("bind?ok?!\r\n");

/*?開始監(jiān)聽相應(yīng)的端口?*/

if(-1?==?listen(sfp,5))

{

printf("listen?fail?!\r\n");

return?-1;

}

printf("listen?ok\r\n");

while(1)

{

sin_size?=?sizeof(struct?sockaddr_in);

/*?accept服務(wù)端使用函數(shù),調(diào)用時即進入阻塞狀態(tài),等待用戶進行連接,在沒有客戶端進行連接時,程序停止在此處,

不會看到后面的打印,當(dāng)有客戶端進行連接時,程序馬上執(zhí)行一次,然后再次循環(huán)到此處繼續(xù)等待。

此處accept的第二個參數(shù)用于獲取客戶端的端口和地址信息。

*/

nfp?=?accept(sfp,?(struct?sockaddr?*)(c_add),?sin_size);

if(-1?==?nfp)

{

printf("accept?fail?!\r\n");

return?-1;

}

printf("accept?ok!\r\nServer?start?get?connect?from?%#x?:?%#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));

/*?這里使用write向客戶端發(fā)送信息,也可以嘗試使用其他函數(shù)實現(xiàn)?*/

if(-1?==?write(nfp,"hello,welcome?to?my?server?\r\n",32))

{

printf("write?fail!\r\n");

return?-1;

}

printf("write?ok!\r\n");

close(nfp);

}

close(sfp);

return?0;

}

/*************************************

文件名:?client.c?

linux?下socket網(wǎng)絡(luò)編程簡例??-?客戶端程序

服務(wù)器端口設(shè)為?0x8888???(端口和地址可根據(jù)實際情況更改,或者使用參數(shù)傳入)

服務(wù)器地址設(shè)為?192.168.1.104

作者:kikilizhm#163.com?(將#換為@)

*/

#include?stdlib.h

#include?sys/types.h

#include?stdio.h

#include?sys/socket.h

#include?linux/in.h

#include?string.h

int?main()

{

int?cfd;?/*?文件描述符?*/

int?recbytes;

int?sin_size;

char?buffer[1024]={0};????/*?接受緩沖區(qū)?*/

struct?sockaddr_in?s_add,c_add;?/*?存儲服務(wù)端和本端的ip、端口等信息結(jié)構(gòu)體?*/

unsigned?short?portnum=0x8888;??/*?服務(wù)端使用的通信端口,可以更改,需和服務(wù)端相同?*/

printf("Hello,welcome?to?client?!\r\n");

/*?建立socket?使用因特網(wǎng),TCP流傳輸?*/

cfd?=?socket(AF_INET,?SOCK_STREAM,?0);

if(-1?==?cfd)

{

printf("socket?fail?!?\r\n");

return?-1;

}

printf("socket?ok?!\r\n");

/*?構(gòu)造服務(wù)器端的ip和端口信息,具體結(jié)構(gòu)體可以查資料?*/

bzero(s_add,sizeof(struct?sockaddr_in));

s_add.sin_family=AF_INET;

s_add.sin_addr.s_addr=?inet_addr("192.168.1.104");?/*?ip轉(zhuǎn)換為4字節(jié)整形,使用時需要根據(jù)服務(wù)端ip進行更改?*/

s_add.sin_port=htons(portnum);?/*?這里htons是將short型數(shù)據(jù)字節(jié)序由主機型轉(zhuǎn)換為網(wǎng)絡(luò)型,其實就是

將2字節(jié)數(shù)據(jù)的前后兩個字節(jié)倒換,和對應(yīng)的ntohs效果、實質(zhì)相同,只不過名字不同。htonl和ntohl是

操作的4字節(jié)整形。將0x12345678變?yōu)?x78563412,名字不同,內(nèi)容兩兩相同,一般情況下網(wǎng)絡(luò)為大端,

PPC的cpu為大端,x86的cpu為小端,arm的可以配置大小端,需要保證接收時字節(jié)序正確。

*/

printf("s_addr?=?%#x?,port?:?%#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port);?/*?這里打印出的是小端

和我們平時看到的是相反的。?*/

/*?客戶端連接服務(wù)器,參數(shù)依次為socket文件描述符,地址信息,地址結(jié)構(gòu)大小?*/

if(-1?==?connect(cfd,(struct?sockaddr?*)(s_add),?sizeof(struct?sockaddr)))

{

printf("connect?fail?!\r\n");

return?-1;

}

printf("connect?ok?!\r\n");

/*連接成功,從服務(wù)端接收字符*/

if(-1?==?(recbytes?=?read(cfd,buffer,1024)))

{

printf("read?data?fail?!\r\n");

return?-1;

}

printf("read?ok\r\nREC:\r\n");

buffer[recbytes]='\0';

printf("%s\r\n",buffer);

getchar();?/*?此句為使程序暫停在此處,可以使用netstat查看當(dāng)前的連接?*/

close(cfd);?/*?關(guān)閉連接,本次通信完成?*/

return?0;

}

Linux增加TCP和UDP的本地端口分配范圍

ip_local_port_range,TCP和UDP本地端口范圍,默認為[32768 , 60999],其中,最小值要求大于等于ip_unprivileged_port_start參數(shù)。

ip_unprivileged_port_start,非特權(quán)端口開始值,默認為1024.如果應(yīng)用程序需要綁定小于此值的端口號,需要root權(quán)限。

臨時調(diào)整

永久調(diào)整

在/etc/sysctl.d目錄下,創(chuàng)建配置文件,將需要調(diào)整的參數(shù)加入其中即可。配置文件名格式為number-appname.conf。appname可以直接用應(yīng)用系統(tǒng)運行時的os用戶名。

執(zhí)行以下命令,使之生效。替換掉命令中的文件名。

例如:


網(wǎng)頁題目:關(guān)于linux創(chuàng)建tcp命令的信息
轉(zhuǎn)載來于:http://weahome.cn/article/doicieh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部