linux c socket 源碼案例,linuxsocket

來源:互聯網
上載者:User

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使用了包交換通訊技術,......餘下全文>>
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.