1. 程式人生 > >linux socket程式設計簡單例子//程式碼

linux socket程式設計簡單例子//程式碼

      最近看了一些網路程式設計的書籍,一直以來總感覺網路程式設計神祕莫測,其實網路程式設計入門還是很容易學的,下面這些程式碼是我在linux下編寫的,已經執行過了,編譯之後就可以運行了。有不足之處希望大家多多指出,共同學習交流。

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

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

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

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協議:

客戶端: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. }  

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, char *argv[])  
  7. {  
  8.     int server_sockfd;  
  9.     int len;  
  10.     struct sockaddr_in my_addr;   //伺服器網路地址結構體
  11.          struct sockaddr_in remote_addr; //客戶端網路地址結構體
  12.     int sin_size;  
  13.     char buf[BUFSIZ];  //資料傳送的緩衝區
  14.     memset(&my_addr,0,sizeof(my_addr)); //資料初始化--清零
  15.     my_addr.sin_family=AF_INET; //設定為IP通訊
  16.     my_addr.sin_addr.s_addr=INADDR_ANY;//伺服器IP地址--允許連線到所有本地地址上
  17.     my_addr.sin_port=htons(8000); //伺服器埠號
  18.     /*建立伺服器端套接字--IPv4協議,面向無連線通訊,UDP協議*/
  19.     if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)  
  20.     {    
  21.         perror("socket");  
  22.         return 1;  
  23.     }  
  24.         /*將套接字繫結到伺服器的網路地址上*/
  25.     if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)  
  26.     {  
  27.         perror("bind");  
  28.         return 1;  
  29.     }  
  30.     sin_size=sizeof(struct sockaddr_in);  
  31.     printf("waiting for a packet.../n");  
  32.     /*接收客戶端的資料並將其傳送給客戶端--recvfrom是無連線的*/
  33.     if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)  
  34.     {  
  35.         perror("recvfrom");   
  36.         return

    相關推薦

    linux socket程式設計簡單例子//程式碼

          最近看了一些網路程式設計的書籍,一直以來總感覺網路程式設計神祕莫測,其實網路程式設計入門還是很容易學的,下面這些程式碼是我在linux下編寫的,已經執行過了,編譯之後就可以運行了。有不足之處希望大家多多指出,共同學習交流。      套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法

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

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

    【python】socket程式設計簡單例子

    #socket_client.py import socket client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('127.0.0.1', 8000)) while

    socket簡單例子

    import 退出 交互 也好 lose ddr conn utf-8 需要 最近剛剛開始學了socket的模塊,就寫了一個服務器與客戶端交互的程序 有兩種模式: 1.就是先電腦自動回復 2.就是人工服務 接下來就是代碼了 服務器端的代碼: 1 import sock

    Linux-socket程式設計-1對1和1對多聊天

    1對1聊天     通過select新增可讀事件的監聽實現。     服務端: #include "header.h" int main(void) { int listenfd = -1; int connfd = -1; struct

    linux socket 程式設計總結

    #include<sys/types.h> #include<sys/socket.h> int socket(int domain, int type, int protocol); domain引數 可指定的協議族

    socket程式設計簡單Demo講解及原始碼分享(C# Winform 內網)

    百科對於定義講的很詳細,就不再敘述了。 然後接下來主要是講解如何在winform上面實現簡單的socket通訊。 首先是伺服器和客戶端兩邊的設定了。 對於伺服器,主要做的是以下幾件事: 1.建立套接字(socket) Socket socketWatch

    《實戰 Linux Socket 程式設計》Warren W.Gay 圖解Key-point學習筆記-1

    第一章 套介面簡介 ————————本文為作者原創,轉載請註明出處———————— 此係列為本人的學習筆記,歡迎大家在留言區對概念進行拓展延伸、糾錯討論! 注:所有的例子程式均來自於原書,筆者親自錄入,如果有讀者有全書原始碼連結,也歡迎在評論區分享給其他讀者!!

    Linux socket程式設計示例3 select函式的使用

    1.select函式簡介 int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout); 當伺服器響應多個客戶端連線的時候,需要定義一個執行緒

    Linux Socket程式設計例項(一個Hello World程式)

    在Linux下寫了個小的socket程式,分為客戶端和伺服器端,服務端開一個埠(2000),做為一個daemon,等待客戶的連線請求.一旦有客戶連線,伺服器端打印出客戶端的IP地址和埠,並且向伺服器端傳送歡迎資訊和時間.下面是服務端的程式碼(tcpserver.c).由於這只是個簡單的程式,所

    Linux程式設計Linux shell程式設計例子:批量處理檔案)

    各位看官們,咱們今天還是接著上一回的內容,列舉具體的例子給大家。閒話休說,言歸正轉。 各位看官們,在實際的工作中經常需要批量處理檔案,比如批量刪除檔案等。咱們今天就通過例子來說明 如何批量操作檔案

    Linux Socket程式設計(不限Linux

    “一切皆Socket!” 話雖些許誇張,但是事實也是,現在的網路程式設計幾乎都是用的socket。 ——有感於實際程式設計和開源專案研究。 我們深諳資訊交流的價值,那網路中程序之間如何通訊,如我們每天開啟瀏覽器瀏覽網頁時,瀏覽器的程序怎麼與web伺服器通訊的?當你用QQ聊天時,QQ程序怎麼與伺服器或你好友所

    c++ linux socket程式設計 c++網路程式設計

    宣告:大部分程式碼來自這篇部落格http://www.cnblogs.com/diligenceday/p/6241021.html, 感謝博主  思路: 思路很重要呦~~~ socket詳細資訊,思路:http://www.cnblogs.com/renfanzi/p/5713054.htm

    Socket程式設計簡單實現區域網多人互聊

                    首先  我們要確認的是在同一個區域網,客戶端使用的IP地址是Server的IP地址和Server的埠。這樣接下來我們就能實現簡單的互聊。 package com.blueZhang; import java.io.BufferedReade

    linux socket程式設計示例

    =============================================== =======server.c================================== #include <stdio.h> #include <s

    lua socket簡單例子

    server.lua socket = require("socket"); host = host or "127.0.0.1"; port = port or "8383"; server = assert(socket.bind(host, port)); ack =

    (轉) linux socket 程式設計(C語言)

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

    Linux-shell程式設計簡單程式

    實驗環境 VMware Workstation Pro下Linux Red Hat 核心版本:2.6.32 一、使用shell程式設計實現輸入一個分數返回分數的等級 1.使用vim進行程式編寫 具體的程式如下: 其中第一行中#!/bin

    linux socket程式設計 出現訊號SIGPIPE,分析及解決

    在編寫一個仿QQ軟體,C/S模式。出現的問題:當客戶機關閉時,伺服器也隨著關閉,糾結很久之後,我gdb了下,出現下面提示資訊: Program received signal SIGPIPE, Broken pipe. 0x0012e416 in __kernel_vsyscall () 在 網上查了一

    linux socket程式設計學習

    socket()   簡述:   建立一個套介面。 #include <winsock.h> SOCKET PASCAL FAR socket( int af, int type, int protocol); a