新聞中心
學(xué)習(xí)指南:Linux TCP例程——提高網(wǎng)絡(luò)編程技巧

創(chuàng)新互聯(lián)建站是專業(yè)的海州網(wǎng)站建設(shè)公司,海州接單;提供成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行海州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
在信息化時代,網(wǎng)絡(luò)編程越來越成為一項重要技能。作為一名程序開發(fā)人員,不僅需要熟練掌握某種編程語言和框架,還需要對網(wǎng)絡(luò)編程有一定的了解和掌握。而Linux是一款廣泛應(yīng)用的開源操作系統(tǒng),也是網(wǎng)絡(luò)編程中的“大殺器”。本文將介紹Linux TCP例程,通過學(xué)習(xí)實例,提高網(wǎng)絡(luò)編程技巧。
一、TCP/IP協(xié)議
TCP/IP是網(wǎng)絡(luò)通信協(xié)議的標準之一,是一個開放的、無所有權(quán)的協(xié)議族。它由TCP(傳輸控制協(xié)議)和IP(網(wǎng)絡(luò)協(xié)議)兩個部分組成。TCP/IP協(xié)議對網(wǎng)絡(luò)通信進行了標準化,從而實現(xiàn)了不同主機之間的互通性。
TCP/IP協(xié)議是一個分層的協(xié)議,可分為四層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和物理層。其中,TCP和UDP(用戶數(shù)據(jù)報協(xié)議)都是傳輸層協(xié)議。TCP是一種可靠的、面向連接的協(xié)議,用于保證數(shù)據(jù)的可靠傳輸。而UDP則是一種不可靠的、無連接的協(xié)議,用于傳輸非關(guān)鍵數(shù)據(jù)。
二、Linux TCP例程
Linux TCP例程包含了一系列TCP的相關(guān)程序,可以幫助開發(fā)人員更加深入地了解TCP協(xié)議,提高網(wǎng)絡(luò)編程技巧。以下是一些常用的Linux TCP例程:
1.創(chuàng)建TCP服務(wù)器
TCP服務(wù)器是指提供TCP服務(wù)的程序。使用Linux TCP例程可以快速地創(chuàng)建一個TCP服務(wù)器,具體步驟如下:
(1)創(chuàng)建socket
int s = socket(AF_INET, SOCK_STREAM, 0);
(2)綁定IP和端口
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (struct sockaddr *)&addr, sizeof(addr));
(3)監(jiān)聽socket
listen(s, SOMAXCONN);
(4)接收連接
struct sockaddr_in client_addr;
int client_len = sizeof(client_addr);
int conn_socket = accept(s, (struct sockaddr *)&client_addr, &client_len);
2.創(chuàng)建TCP客戶端
TCP客戶端是指連接TCP服務(wù)器進行通信的程序。使用Linux TCP例程可以快速地創(chuàng)建一個TCP客戶端,具體步驟如下:
(1)創(chuàng)建socket
int s = socket(AF_INET, SOCK_STREAM, 0);
(2)連接服務(wù)器
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(8888);
inet_pton(AF_INET, “127.0.0.1”, &addr.sin_addr);
connect(s, (struct sockaddr *)&addr, sizeof(addr));
3.發(fā)送和接收數(shù)據(jù)
TCP協(xié)議是面向連接的協(xié)議,需要先建立連接再進行數(shù)據(jù)傳輸。使用Linux TCP例程可以方便地發(fā)送和接收數(shù)據(jù),具體步驟如下:
(1)發(fā)送數(shù)據(jù)
char send_buf[1024];
memset(send_buf, 0, sizeof(send_buf));
strcpy(send_buf, “Hello World!”);
send(conn_socket, send_buf, strlen(send_buf), 0);
(2)接收數(shù)據(jù)
char recv_buf[1024];
memset(recv_buf, 0, sizeof(recv_buf));
int recv_len = recv(conn_socket, recv_buf, sizeof(recv_buf), 0);
if(recv_len>0)
{
printf(“recv:%s\n”, recv_buf);
}
4.關(guān)閉socket
使用socket后需要關(guān)閉socket,防止資源泄露。
close(s);
三、
網(wǎng)絡(luò)編程是程序開發(fā)中不可或缺的一環(huán),Linux TCP例程是學(xué)習(xí)網(wǎng)絡(luò)編程的重要學(xué)習(xí)資源。通過本文提供的TCP例程,開發(fā)人員可以深入了解TCP協(xié)議的工作原理,并提高網(wǎng)絡(luò)編程的技巧。
(注:本文例程為簡化版,僅供參考。)
相關(guān)問題拓展閱讀:
- linux下怎么設(shè)置tcp
- C語言Linux系統(tǒng)下TCP編程,connect 錯誤
- 如何用linux socket tcp實現(xiàn)一臺主機向多臺主機同時發(fā)送信息
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=.在調(diào)用send前,在setsockopt函數(shù)中為SNDBUF設(shè)置更大的值 3.使用write替代send,因為write沒有設(shè)置O_NDELAY或者O_NONBLOCK1. tcp 收發(fā)緩沖區(qū)默認值 # cat /proc/sys/net/ipv4/tcp_rmem:tcp接收緩沖區(qū)的默認值# cat /proc/sys/net/ipv4/tcp_wmem6384 : tcp 發(fā)送緩沖區(qū)的默認值2. tcp 或udp收發(fā)緩沖區(qū)更大值# cat /proc/sys/net/core/rmem_max71:tcp 或 udp 接收緩沖區(qū)更大可設(shè)置值的一半。也就是說調(diào)用 setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 時rcv_size 如果超過,那么getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 去到的值就等于* 2 =# cat /proc/sys/net/core/wmem_max071:tcp 或 udp 發(fā)送緩沖區(qū)更大可設(shè)置值得一半。跟上面同一個道理3. udp收發(fā)緩沖區(qū)默認值# cat /proc/sys/net/core/rmem_default:udp接收緩沖區(qū)的如虛賀默認值# cat /proc/sys/net/core/wmem_default16:udp發(fā)送緩沖區(qū)的默認值. tcp 或udp收發(fā)緩沖區(qū)最渣派小值tcp 或udp接收緩沖區(qū)的最小值為 256 bytes,由內(nèi)核的宏決定;tcp 或udp發(fā)送緩沖區(qū)的最小值為 2023 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è)置為32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));//發(fā)送緩沖區(qū)int nSendBuf=32*1024;//設(shè)置為32Ksetsockopt(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 int 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:描述字不是一個套接口。
C語言Linux系統(tǒng)下TCP編程,connect 錯誤
你的client有問題,連接之前沒裂指有指定server的ip。
你只數(shù)顫指定了端肆畢配口。
struct sockaddr_in servaddr;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(HELLO_WORLD_SERVER_PORT);
servaddr.sin_addr.s_addr=inet_addr(serverip);//加上server的ip即可
如何用linux socket tcp實現(xiàn)一臺主機向多臺主機同時發(fā)送信息
多建幾個socket就行了啊
做個無限循環(huán), 每次accept一個請求就新建一個線程和socket,在新的線程中對新的socket讀寫
linux tcp 例程的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux tcp 例程,「學(xué)習(xí)指南」Linux TCP例程:提高網(wǎng)絡(luò)編程技巧,linux下怎么設(shè)置tcp,C語言Linux系統(tǒng)下TCP編程,connect 錯誤,如何用linux socket tcp實現(xiàn)一臺主機向多臺主機同時發(fā)送信息的信息別忘了在本站進行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機房服務(wù)器托管/機柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機房租用、服務(wù)器托管、機柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動、聯(lián)通機房等。
標題名稱:「學(xué)習(xí)指南」LinuxTCP例程:提高網(wǎng)絡(luò)編程技巧(linuxtcp例程)
網(wǎng)頁網(wǎng)址:http://fisionsoft.com.cn/article/cdggcjs.html


咨詢
建站咨詢
