1. 程式人生 > >Linux C語言的Socket程式設計例子(TCP和UDP)

Linux C語言的Socket程式設計例子(TCP和UDP)

     套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法的是,它並不侷限於同一臺計算機的資源,例如檔案系統空間,共享記憶體或者訊息佇列。套接字可以認為是對管道概念的擴充套件——一臺機器上的程序可以使用套接字與另一臺機器上的程序通訊。因此客戶與伺服器可以分散在網路中。同一臺機器上的程序間也可以用套接字通訊。套接字是一種通訊機制,客戶/伺服器系統既可以在本地單機上執行,也可以在網路中執行。套接字與管道的區別:它明確區分客戶與伺服器,可以實現將多個客戶連線到一個伺服器。

套接字的工作過程(伺服器端):首先,伺服器應用程式通過socket系統呼叫建立一個套接字,它是系統分配給該伺服器程序的類似檔案描述符的資源,不能與其他程序共享。其次,伺服器程序使用bind系統呼叫給套接字命名。

本地套接字的名字是linux檔案系統的檔名,一般放在/tmp或者/usr/tmp 目錄下。網路套接字的名字是與客戶相連線的特定網路有關的服務識別符號。此識別符號允許linux將進入的針對特定埠號的連線轉到正確的伺服器程序。接下來,伺服器程序開始等待客戶連線到這個命名套接字,呼叫listen建立一個等待佇列以便存放來自客戶的進入連線。最後,伺服器通過accept系統呼叫來接受客戶的連線。此時,會產生一個與原有的命名套接字不同的新套接字,它僅用於與這個特定的客戶通訊,而命名套接字則被保留下來繼續處理來自其他客戶的連線。  

     套接字的工作過程客戶端):呼叫socket建立一個未命名套接字,將伺服器的命名套接字作為一個地址來呼叫connect與伺服器建立連線。一旦建立了連線,就可以像使用底層檔案描述符那樣來用套接字進行雙向的資料通訊。

一、Linux Socket

1、TCP協議:

伺服器端:tcp_server.c

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. int main(int argc, char *argv[])  
  7. {  
  8.     int server_sockfd;//伺服器端套接字
  9.     int client_sockfd;//客戶端套接字
  10.     int len;  
  11.     struct sockaddr_in my_addr;   
    //伺服器網路地址結構體
  12.     struct sockaddr_in remote_addr; //客戶端網路地址結構體
  13.     int sin_size;  
  14.     char buf[BUFSIZ];  //資料傳送的緩衝區
  15.     memset(&my_addr,0,sizeof(my_addr)); //資料初始化--清零
  16.     my_addr.sin_family=AF_INET; //設定為IP通訊
  17.     my_addr.sin_addr.s_addr=INADDR_ANY;//伺服器IP地址--允許連線到所有本地地址上
  18.     my_addr.sin_port=htons(8000); //伺服器埠號
  19.     /*建立伺服器端套接字--IPv4協議,面向連線通訊,TCP協議*/
  20.     if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)  
  21.     {    
  22.         perror("socket");  
  23.         return 1;  
  24.     }  
  25.         /*將套接字繫結到伺服器的網路地址上*/
  26.     if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)  
  27.     {  
  28.         perror("bind");  
  29.         return 1;  
  30.     }  
  31.     /*監聽連線請求--監聽佇列長度為5*/
  32.     listen(server_sockfd,5);  
  33.     sin_size=sizeof(struct sockaddr_in);  
  34.     /*等待客戶端連線請求到達*/
  35.     if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)  
  36.     {  
  37.         perror("accept");  
  38.         return 1;  
  39.     }  
  40.     printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr));  
  41.     len=send(client_sockfd,"Welcome to my server\n",21,0);//傳送歡迎資訊
  42.     /*接收客戶端的資料並將其傳送給客戶端--recv返回接收到的位元組數,send返回傳送的位元組數*/
  43.     while((len=recv(client_sockfd,buf,BUFSIZ,0))>0)  
  44.     {  
  45.         buf[len]='\0';  
  46.         printf("%s\n",buf);  
  47.         if(send(client_sockfd,buf,len,0)<0)  
  48.         {  
  49.             perror("write");  
  50.             return 1;  
  51.         }  
  52.     }  
  53.     close(client_sockfd);  
  54.     close(server_sockfd);  
  55.         return 0;  
  56. }  

客戶端:tcp_client.c

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. int main(int argc, char *argv[])  
  7. {  
  8.     int client_sockfd;  
  9.     int len;  
  10.     struct sockaddr_in remote_addr; //伺服器端網路地址結構體
  11.     char buf[BUFSIZ];  //資料傳送的緩衝區
  12.     memset(&remote_addr,0,sizeof(remote_addr)); //資料初始化--清零
  13.     remote_addr.sin_family=AF_INET; //設定為IP通訊
  14.     remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//伺服器IP地址
  15.     remote_addr.sin_port=htons(8000); //伺服器埠號
  16.     /*建立客戶端套接字--IPv4協議,面向連線通訊,TCP協議*/
  17.     if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)  
  18.     {  
  19.         perror("socket");  
  20.         return 1;  
  21.     }  
  22.     /*將套接字繫結到伺服器的網路地址上*/
  23.     if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)  
  24.     {  
  25.         perror("connect");  
  26.         return 1;  
  27.     }  
  28.     printf("connected to server\n");  
  29.     len=recv(client_sockfd,buf,BUFSIZ,0);//接收伺服器端資訊
  30.          buf[len]='\0';  
  31.     printf("%s",buf); //列印伺服器端資訊
  32.     /*迴圈的傳送接收資訊並列印接收資訊--recv返回接收到的位元組數,send返回傳送的位元組數*/
  33.     while(1)  
  34.     {  
  35.         printf("Enter string to send:");  
  36.         scanf("%s",buf);  
  37.         if(!strcmp(buf,"quit"))  
  38.             break;  
  39.         len=send(client_sockfd,buf,strlen(buf),0);  
  40.         len=recv(client_sockfd,buf,BUFSIZ,0);  
  41.         buf[len]='\0';  
  42.         printf("received:%s\n",buf);  
  43.     }  
  44.     close(client_sockfd);//關閉套接字
  45.         return 0;  
  46. }  

2、UDP協議:

伺服器端:udp_server.c

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. int main(int argc, 

    相關推薦

    Linux C語言Socket程式設計例子TCPUDP

         套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法的是,它並不侷限於同一臺計算機的資源,例如檔案系統空間,共享記憶體或者訊息佇列。套接字可以認為是對管道概念的擴充套件——一臺機器上的程序可以使用套接字與另一臺機器上的程序通訊。因此客戶與伺服器可以分散在網

    Windows下C語言Socket程式設計例子TCPUDP

    1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4 5 #pragma comment(lib,"ws2_32.lib") 6 7 int main(int argc, char

    從 0 開始學習 Linux 系列之「27.Socket 程式設計基礎TCPUDP

    Socket 介面簡介 Socket 套接字是由 BSD(加州大學伯克利分校軟體研發中心)開發的一套獨立於具體協議的網路程式設計介面,應用程式可以用這個介面進行網路通訊。要注意:Socket 不是一套通訊協議(HTTP,FTP 等是通訊協議),而是程式設計的介

    網絡編程-socketTCPUDP

    int ack tro 127.0.0.1 監聽 input 地址 con print TCP server端 import socketsk = socket.socket() # 創建了一個socket對象sk.bind((‘192.168.21.36‘,8

    RTSP流媒體資料傳輸的兩種方式TCPUDP

    通常情況下rtsp協議中資料傳輸的實現是UDP,因工作需要,想讓rtsp的資料傳輸部分用TCP實現。DarwinStreamingServer伺服器能自適應客戶端發起的資料傳輸請求是用TCP方式,還是用UDP方式,這裡唯一需要解決的是客戶端協議的發起問題,而vlc支援RTS

    Linux下的socket程式設計實踐TCP服務端優化常見函式

    併發下的殭屍程序處理 只有一個程序連線的時候,我們可以使用以下兩種方法處理殭屍程序: 1)通過忽略SIGCHLD訊號,避免殭屍程序     在server端程式碼中新增     signal(

    Windows C語言 Socket程式設計 server端伺服器--初級多客戶端——初級版

    看過我的簡單版的伺服器程式碼的,會發現那段程式碼同一時間只能和一個客戶端通訊。這樣的程式碼能力很小侷限性很大。今天我來介紹一種多客戶端的伺服器程式碼。當然這段程式碼還是有問題的,至於是什麼問題我會在程式碼後面說清楚。 我的這個多客戶端的程式碼核心思想是多執行緒

    [C語言] Socket程式設計簡單例子/Client+Server

    一、原理=====1.基於TCP協議的伺服器端程式流程:=======1)建立套接字(socket)2)繫結套接字(bind)3)將套接字設為監聽,準備接收客戶請求(listen)4)等待客戶請求的到來,當請求到來後,接受請求,返回一個對應於此次連線的套接字(accept)5)用返回的套接字與客戶端進行通訊(

    Windows C語言 Socket程式設計 client端客戶端--斷線重連版

    瞭解了最基礎的C語言客戶端的編寫流程,稍稍加以改動即可實現斷線重連。 當伺服器掉線時,客戶端會以固定的頻率不停的重連。 #include <stdio.h> #include <winsock2.h> #pragma comme

    Linux下的socket程式設計實踐TCP的粘包問題常用解決方案

    TCP粘包問題的產生 由於TCP協議是基於位元組流並且無邊界的傳輸協議, 因此很有可能產生粘包問題。此外,傳送方引起的粘包是由TCP協議本身造成的,TCP為提高傳輸效率,傳送方往往要收集到足夠多的資料

    (排序演算法)linux c語言實現快速排序氣泡排序的改進版

     快速排序演算法是對氣泡排序演算法的一種改進,氣泡排序是對單個元素的升降,快速排序是對所有元素的升降,不過這個升降是取了某一個標準的前提下,在本文程式碼中,就以a[i],其實就是以最左邊的元素為參考,比較交換之後,將這個參考元素放到分界的地方,即i的位置。 程式碼如下,裡面有比較詳細的

    python3 下的Socket程式設計TCP&UDP

    網路程式設計中最重要的兩個協議:TCP協議和UDP協議 TCP協議是網際網路中使用最廣泛的傳輸協議,這得益於其穩定,可靠的優勢。TCP協議是面向連線的傳輸協議,通訊雙方(通常是兩個主機上面的兩個程式)需要先建立連線,才能傳輸資料。資料在傳輸過程中會被分成多個小的資料包,這些資料包都會被新

    C語言socket程式設計總結(二) inet_pton,/inet_ntop

    + (NSString *)getSockAddrIPString:(conststructsockaddr *)sa{    switch(sa->sa_family)    {        case AF_INET:            {                char ipv4_st

    C語言基礎程式設計題目函式題

    6-1 簡單輸出整數 (10 分) 本題要求實現一個函式,對給定的正整數N,列印從1到N的全部正整數。 函式介面定義: void PrintN ( int N ); 其中N是使用者傳入的引數。該函式必須將從1到N的全部正整數順序打印出來,每個數字佔1行。 裁判

    C語言socket程式設計---udp通訊及廣播

    上篇實現了TCP通訊的例子。由於專案中需要一個伺服器向多臺客戶端傳送訊息。 通過udp這種無連線的通訊,將client.c增加一句 /* 設定通訊方式對廣播,即本程式傳送的一個訊息,網路上所有主機均可以收到 */ yes = 1; setsockopt(fd

    Linux下的socket程式設計實踐 Select的限制poll併發的初步知識

    select的限制 用select實現的併發伺服器,能達到的併發數一般受兩方面限制: 1)一個程序能開啟的最大檔案描述符限制。這可以通過調整核心引數來改變。可以通過ulimit -n(number)來調整或者使用setrlimit函式設定(需要root許可權),但一個系

    Linux下的socket程式設計實踐Unix域協議和socketpair傳遞檔案描述符

    UNIX域協議並不是一個實際的協議族,而是在單個主機上執行客戶/伺服器通訊的一種方法,所用API與在不同主機上執行客戶/伺服器通訊所使用的API相同。UNIX域協議可以視為IPC方法之一,Unix域協

    socket程式設計TCPUDP

    Linux下的Socket程式設計大體上包括Tcp Socket、Udp Socket即Raw Socket這三種,其中TCP和UDP方式的Socket程式設計用於編寫應用層的socket程式,是我們用得比較多的,而Raw Socket則用得相對較少,不在本文介紹範圍之列

    Linux下的socket程式設計實踐設定套接字I/O超時的方案

    (一)使用alarm 函式設定超時 #include <unistd.h>  unsigned int

    1014 C語言程序設計教程第三版課後習題6.4

    content += 教程 print ons ont c語言程序設計 lld cnblogs 題目描述 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一個數字。 輸入 n 輸出 和 樣例輸入 5 樣例輸出 153 1 #include "stdio.h"