1. 程式人生 > >網路套接字socket(tcp、server、client)

網路套接字socket(tcp、server、client)

在實現套接字網路通訊之前,先來了解一下概念:

socket

socket這個詞在TCP/IP協議中,“IP地址+TCP或UDP埠號”唯一標識網
絡通訊中的一個程序,“IP地址+埠號”就稱為socket。

網路位元組序

  網路通訊的時候必須知道埠號,如果傳送端是大端位元組序,接收端是小端位元組序,那麼最後看到的埠號就是不正確的埠號,所以,我們必須將埠號在傳送端和接收端之間轉換成統一的位元組序形式,TCP/IP協議規定,網路資料流應採用大端位元組序,即低地址高位元組

相關埠

  struct sockaddr_in
  {
     __SOCKADDR_COMMON (sin_);     //協議型別
in_port_t sin_port; // Port number struct in_addr sin_addr; // Internet address /* Pad to size of `struct sockaddr'. */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof
(struct in_addr)]; };

socket:申請檔案描述符

 int socket(int domain, int type, int protocol);
 //protocol引數: 與特定的地址家族相關的協議,TCP協議一般為IPPROTO_TCP。也可以寫0,那麼系統會根據地址格式和套接字類別,自動選擇一個適合的協議。

listen:使上面申請到的檔案描述符進入監聽狀態

 int listen(int sockfd, int backlog);   //backlog連線佇列長度

bind:繫結本機的資訊,包括,IP地址型別,IP地址,埠號

int
bind(int sockfd, cinst struct sockaddr *affr, socklen_t addrlen);

accept:接受監聽套接字,成功返回一個檔案描述符(真正用於通訊的套接字)

int accept(int sockfd, struct sockaddr *addr, 
           sochlen_t *addrlen);

下面來完成一個tcp的客戶端和使用者端的編寫

//server.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int StartUp(int port,const char* ip)
{
    int ListenSock = socket(AF_INET,SOCK_STREAM,0);
    if(ListenSock < 0)
    {
        perror("socket");
        exit(1);
    }
    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(port);
    local.sin_addr.s_addr = inet_addr(ip);
    if(bind(ListenSock,(struct sockaddr*)&local,sizeof(local)) < 0)
    {
        perror("bind");
        exit(2);
    }
    if(listen(ListenSock,5) < 0)
    {
        perror("listen");
        exit(3); 
    }
    return ListenSock;
}

int main(int argc,const char* argv[])
{
    if(argc != 3)
    {
        printf("input error\n");
        return 1;
    }
    int len;
    int listenSock = StartUp(atoi(argv[2]),argv[1]);
    struct sockaddr_in client;
    while(1)
    {
        int sock = accept(listenSock,(struct sockaddr*)&client,&len);//獲取客戶機的資訊
        if(sock < 0)
        {
            perror("accept");
            continue;
        }
        printf("get a client,ip is %s,port is %d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
        char buf[1024];
        while(1)
        {
            ssize_t s = read(sock,buf,sizeof(buf)-1);//伺服器進行讀資料
            if(s > 0)
            {
                buf[s] = 0;
                printf("client# %s\n",buf);
            }
            else
            {
                //資料已經讀完了,客戶端不傳送資料了
                printf("client is quit!\n");
            }
        }
        close(sock);
    }
    return 0;
}
//client.c
#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<arpa/inet.h>

int main(int argc,const char* argv[])
{
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0)
    {
        perror("socket");
        return 1;
    }
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(argv[2]));
    server.sin_addr.s_addr = inet_addr(argv[1]);
    if(connect(sock,(struct sockaddr*)&server,sizeof(server)) < 0)
    {
        perror("connect");
        return 2;
    }
    char buf[1024];
    while(1)
    {
        printf("send# ");
        fflush(stdout);
        //從標準輸入讀資料,讀到buf中,然後從buf寫到管道
        ssize_t s = read(0,buf,sizeof(buf)-1);
        if(s < 0)
        {           
            perror("read");
            return 3;
        }       
        buf[s-1] = 0;
        write(sock,buf,s);
    }
    close(sock);
    return 0;
}

相關推薦

網路sockettcpserverclient

在實現套接字網路通訊之前,先來了解一下概念: socket socket這個詞在TCP/IP協議中,“IP地址+TCP或UDP埠號”唯一標識網 絡通訊中的一個程序,“IP地址+埠號”就稱為socket。 網路位元組序   網路通訊的時候必須知道

嵌入式Linux網路程式設計,網路基礎,socketSOCK_STREAMSOCK_DGRAMSOCK_RAW,IP地址,埠號,位元組序,位元組序轉換函式,IP地址的轉換

文章目錄 1,socket 1.1,socket的型別(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW) 1.2,socket的位置 2,IP地址 2.1,特殊IP地址: 3,埠號

《c語言從入門到精通》看書筆記——第16章 網路程式設計——網路

      (1)TCP協議:傳輸協議(TCP)是一種提供克勞資料傳送的通用協議,他是TCP/IP體系結構中傳輸層上的協議。在傳送資料時,應用層的資料傳輸到傳輸層,傢伙是哪個TCP首部,資料就構成了報文。報文就是網路層IP的資料,如果再加上IP首部,就構成了IP資料報。TCP協議的C語言資料描述如下:  

網路程式設計常用的通訊協議Socket程式設計Socket和ServerSocket埠號

網路程式設計:     java語言中,提供了一套統一的程式設計介面。很多細節都已經底層化。            所在,可以進行無痛的網路通訊程式設計。            提供的是Socket套接字技術。  --常用的通訊協議:    (1)TCP/IP:在通訊之前,需

趣談網路協議Socket

基於TCP協議的Socket程式函式呼叫過程 (1)TCP的伺服器要先監聽一個埠,一般是先呼叫bind函式,給這個Socket賦予一個IP地址和埠 (2)為什麼要有埠,當一個網路包來的時候,核心要通過TCP頭裡面的這個埠,來找到你這個應用程式,把包給你 (3)為什麼要有IP地

網路 協議 socket TCP程式設計

網路; 通過物理線路將多臺計算機連線起來組成網際網路計算機平臺,實現多臺計算機的資料交換。 網路協議 ip --Internet protocal;32位(二進位制) 是一套通用規則,為了多臺計算機能在網路上進行網路通訊互聯而設計的協議。 本機地址;127.0.

網路程式設計二(Socket客戶端和服務端通訊問題)

在客戶機/伺服器工作模式中,在Server端,要準備接受多個Client端計算機的通訊。為此,除用IP地址標識Internet上的計算機之外,另還引入埠號,用埠號標識正在Server端後臺服務的執行緒。埠號與IP地址的組合稱為網路套接字(socket)。 Java語言在

1.socket程式設計:socket程式設計,網路位元組序,函式介紹,IP地址轉換函式,sockaddr資料結構,網路函式,socket相關函式,TCP serverclient

 1Socket程式設計 socket這個詞可以表示很多概念: 在TCP/IP協議中,“IP地址+TCP或UDP埠號”唯一標識網路通訊中的一個程序,“IP 地址+埠號”就

socket---網路

套接字socket---網路套接字   網路套接字 採用迴路網路連線到一個網路套接字 迴路網路只包含一臺計算機,通常稱為localhost,IP地址為127.0.0.1,可以在/etc/hosts檔案中找到   例子: 客戶端發一個A給伺服

走進Linux核心網路 的祕密—socket與sock

雙十一 今天是雙十一,記得還在念書的時候,每次都會參加京東圖書滿200-100的活動,然後腦子一熱屯一堆書。印象中人文類的書基本都會看,而電子資訊類的可能就只看了一半,甚至買過哪些都忘了。究其原因,主要是人文類的通常都是自己想看的,而技術類的就跟風看哪個銷量大買

TCP和UDP程式設計 java實現

在瞭解網路程式設計之前,我們先了解一下什麼叫套接字 套接字即指同一臺主機內應用層和運輸層之間的介面 由於這個套接字是建立在網路上建立網路應用的可程式設計介面 因此也將套接字稱為應用程式和網路之間的應用程式程式設計介面!   關於TCP和UDP這裡就不作太多介紹了,我們知道TCP是面向連

網路程式設計基礎【林老師版】:簡單的 通訊

一、服務端程式碼  import socket #1、買手機 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) #2、繫結手機卡 phone.bind(('127.0.0.1',8081)) #0-

網路程式設計(Socket)

網路預備知識學習:https://blog.csdn.net/hansionz/article/details/85224786 網路程式設計套接字 一.IP地址和埠號 1.IP地址 2.埠號 2.1 什麼是埠號

程序筆記2:程序之間的通訊UNIX域socket

socket的地址資料結構根據不同的系統以及網路環境有不同形式。為了使不同格式地址能夠被傳入套接字函式,必須強制將地址結構轉換為: struct sockaddr{ sa_family_t sa_family; /* address family*/ char

利用網路實現TCP互動

我們來了解一下TCP互動流程: 大致流程如下: (1)伺服器根據地址的型別(屬於ipv4還是ipv6等)、socket型別(比如TCP、UDP)去建立socket,創建出的套接字socket本質

網路程式設計—基礎 & 基本TCP程式設計-基本函式

套接字基礎 一個通用套接字地址結構sockaddr: struct sockaddr { unsigned short sa_family; //套接字的協議簇地址型別,AF_XX char sa_data[14];//儲存

Socket 程式設計附例項

TCP/IP地址家族統一的套接字地址結構定義如下: struct sockaddr_in { short sin_family; //指定地址家族,即地址格式 unsigned short

程式設計----基於TCP協議

套接字(socket):可以看做是不同主機之間的程序進行雙向通訊的端點,即通訊的兩方的一種約定,用套接字中的相關函式來完成通訊過程。 **socket=Ip Address+TCP/UDP+port

Java Socket:飛鴿傳書的網路

在古代,由於通訊不便利,一些聰明的人就利用鴿子會飛且飛得比較快、會辨認方向的優點,對其進行了馴化,用來進行訊息的傳遞——也就是所謂的“飛鴿傳書”。而在 Java 中,網路套接字(Socket)扮演了同樣的角色。 套接字(Socket)是一個抽象層,應用程

設置非阻塞的Socket

api pad def while循環 ace 使用方法 小時 acc 使用 當使用socket()函數和WSASocket()函數創建套接字時,默認都是阻塞的。在創建套接字之後,通過調用ioctlsocket()函數,將該套接字設置為非阻塞模式。函數的第一個參數是套接字