linux c socket 源碼案例,linuxsocket
service端
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>#include <sys/shm.h>#define MYPORT 8887#define QUEUE 20#define BUFFER_SIZE 1024int main(){ ///定義sockfd int server_sockfd = socket(AF_INET,SOCK_STREAM, 0); ///定義sockaddr_in struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(MYPORT); server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); ///bind,成功返回0,出錯返回-1 if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1) { perror("bind"); exit(1); } ///listen,成功返回0,出錯返回-1 if(listen(server_sockfd,QUEUE) == -1) { perror("listen"); exit(1); } ///用戶端通訊端 char buffer[BUFFER_SIZE]; struct sockaddr_in client_addr; socklen_t length = sizeof(client_addr); ///成功返回非負描述字,出錯返回-1 int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length); if(conn<0) { perror("connect"); exit(1); } while(1) { memset(buffer,0,sizeof(buffer)); int len = recv(conn, buffer, sizeof(buffer),0); if(strcmp(buffer,"exit\n")==0) break; fputs(buffer, stdout); send(conn, buffer, len, 0); } close(conn); close(server_sockfd); return 0;}
client端
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>#include <sys/shm.h>#define MYPORT 8887#define BUFFER_SIZE 1024int main(){ ///定義sockfd int sock_cli = socket(AF_INET,SOCK_STREAM, 0); ///定義sockaddr_in struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(MYPORT); ///伺服器連接埠 servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ///伺服器ip ///串連伺服器,成功返回0,錯誤返回-1 if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("connect"); exit(1); } char sendbuf[BUFFER_SIZE]; char recvbuf[BUFFER_SIZE]; while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL) { send(sock_cli, sendbuf, strlen(sendbuf),0); ///發送 if(strcmp(sendbuf,"exit\n")==0) break; recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收 fputs(recvbuf, stdout); memset(sendbuf, 0, sizeof(sendbuf)); memset(recvbuf, 0, sizeof(recvbuf)); } close(sock_cli); return 0;}
測試:
Linux中C語言的一個函數的原始碼:socket 編程中的 recv() 函數
你好
recv函數只是在使用者空間定義的。核心空間有與之對應的函數,也就是說,執行recv函數就會調用到核心中與它對應的函數,實際起作用的就是核心裡的這個函數。
至於核心裡調用的是那個函數,你不需要是找,那樣會把你看暈的,核心裡的調用關係複雜的很,除非對核心非常瞭解的,才會找到到底是怎麼調用的,他也是只是找到怎麼調用的,至於為什麼這樣調用是極少人知道的。得問linux的開發人員。因為核心的代碼量是太多了。有人花了三年時間才看完核心代碼。
souce insight只能尋找核心裡有的東西,屬於核心的。recv()函數是不屬於核心的,所以用這個是尋找不到的
希望可以幫到你,望選為滿意答案
linux socket網路編程代碼
Linux是多任務的作業系統,可在運行在Intel 80386及更高檔次的PC機、ARMS、MIPS和PowerPC等多種電腦平台,已成為應用廣泛、可靠性高、功能強大的電腦作業系統,Linux具有核心小、效率高、原始碼開放等優點,還內含了TCP/IP網路通訊協定,很適合在伺服器領域使用,而伺服器主要用途之一就是進行網路通訊,隨著電腦辦公自動化處理技術的應用與推廣,網路的不斷普及,傳統的紙張式檔案傳輸方式已經不再適合發展的需要,人們更期待一種便捷、高效、環保、安全的網路傳輸方式.
協議概述TCP/IP即傳輸控制通訊協定/網路通訊協定[1](Transmission Control Protocol/Internet Protocol),是一個由多種協議組成的協議族,他定義了電腦通過網路互相通訊及協議族各層次之間通訊的規範,圖1描述了Linux對IP協議族的實現機制[2]。
Linux支援BSD的通訊端和全部的TCP/IP協議,是通過網路通訊協定將其視為一組相連的軟體層來實現的,BSD通訊端(BSD Socket)由通用的通訊端管理軟體支援,該軟體是INET通訊端層,用來管理基於IP的TCP與UDP連接埠到連接埠的互聯問題,從協議分層來看,IP是網路層協議,TCP是一個可靠的連接埠到連接埠的傳輸層協議,他是利用IP層進行傳接報文的,同時也是連線導向的,通過建立一條虛擬電路在不同的網路間傳輸報文,保證所傳輸報文的無丟失性和無重複性。使用者資料報文協議(User Datagram Protocol,UDP)也是利用IP層傳輸報文,但他是一個非連線導向的傳輸層協議,利用IP層傳輸報文時,當目的方網際協議層收到IP報文後,必須識別出該報文所使用的上層協議(即傳輸層協議),因此,在IP前序上中,設有一個"協議"域(Protocol)。通過該域的值,即可判明其上層協議類型,傳輸層與網路層在功能說的最大區別是前者提供進程通訊能力,而後者則不能,在進程通訊的意義上,網路通訊的最終地址不僅僅是主機地址,還包括可以描述進程的某種標識符,為此,TCP/UDP提出了協議連接埠(Protocol Port)的概念,用於標識通訊的進程,例如,Web伺服器處理序通常使用連接埠80,在/etc/services檔案中有這些註冊了的連接埠地址。
對於TCP傳輸,傳輸節點間先要建立串連,然後通過該串連傳輸已排好序的報文,以保證傳輸的正確性,IP層中的代碼用於實現網際協議,這些代碼將IP頭增加到傳輸資料中,同時也把收到的IP報文正確的傳送到TCP層或UDP層。TCP是一個連線導向協議,而UDP則是一個非連線導向協議,當一個UDP報文發送出去後,Linux並不知道也不去關心他是否成功地到達了目的的主機,IP層之下,是支援所有Linux網路應用的網路裝置層,例如點到點協議(Point to Point Protocol,PPP)和乙太網路層。網路裝置並非總代表物理裝置,其中有一些(例如回送裝置)則是純粹的軟體裝置,網路裝置與標準的Linux裝置不同,他們不是通過Mknod命令建立的,必須是底層軟體找到並進行了初始化之後,這些裝置才被建立並可用。因此只有當啟動了正確設定的乙太網路裝置驅動程式的核心後,才會有/dev/eth0檔案,ARP協議位於IP層和支援位址解析的協議層之間。
網路通訊原理所有的網路通訊就其實現技術可以分為兩種,線路交換和包交換,電腦網路一般採用包交換,TCP使用了包交換通訊技術,......餘下全文>>