1. 程式人生 > >基於UDP的網路程式設計

基於UDP的網路程式設計

UDP協議(使用者資料報協議):



 - 傳輸層協議
 - 沒有連線
 - 不可靠
 - 面向資料報


我們先建立一個簡易的客戶端和伺服器。


伺服器:



 - socket:先建立一個套接字
 - bind:將建立的套接字繫結到地址和埠上
 - recvfrom:下面就以阻塞的方式等待客戶端的資料


客戶端:



 - socket:先建立一個套接字
 - sendto:和伺服器進行通訊


其中涉及到的函式如下:


#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>


int socket(int domain, int type, int protocol);
//domain:協議域,又稱協議族(family)。常用的協議族有AF_INET、AF_INET6、AF_LOCAL(或稱AF_UNIX,Unix域Socket)、AF_ROUTE等。協議族決定了socket的地址型別,在通訊中必須採用對應的地址,如AF_INET決定了要用ipv4地址(32位的)與埠號(16位的)的組合、AF_UNIX決定了要用一個絕對路徑名作為地址。
//type:指定Socket型別。常用的socket型別有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。流式Socket(SOCK_STREAM)是一種面向連線的Socket,針對於面向連線的TCP服務應用。資料報式Socket(SOCK_DGRAM)是一種無連線的Socket,對應於無連線的UDP服務應用。
//protocol:指定協議。常用協議有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,分別對應TCP傳輸協議、UDP傳輸協議、STCP傳輸協議、TIPC傳輸協議。
ssize_t sendto(int sock, void *buff, size_t nbytes, int flags, 
			   struct sockaddr *to, socklen_t addrlen);
//sock:用於傳輸資料的UDP套接字檔案描述符 
//buff:儲存待傳輸資料的緩衝地址值 
//nbytes:待傳輸的資料長度,以位元組為單位 
//flags:可選引數,若沒有則傳遞0 
//to:存有目標地址資訊的sockaddr結構體變數的地址值 
//addrlen:傳遞給引數to的地址值結構體變數長度
ssize_t recvfrom(int sock, void *buff, size_t nbytes, int flags, 
				struct sockaddr *from, socklen_t *addrlen);
//sock:用於接收資料的UDP套接字檔案描述符 
//buff:儲存接收資料的緩衝地址值 
//nbytes:可接收的最大位元組數 
//flags:可選引數,若沒有則傳入0 
//from:存有傳送端地址資訊的sockaddr結構體變數的地址值 
//addrlen:儲存引數from的結構體變數長度的變數地址值

server.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>


int main(int argc,char* argv[])
{
    if(argc != 3)//判斷輸入的格式
    {
        printf("please enter:[%s,ip,port].\n",argv[0]);
        return 1;
    }
	//建立一個套接字
    int sock = socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0)
    {
        printf("socket error!\n");
        return 2;
    }
	//因為我們採用的IPv4協議,所以得建立一個sockaddr_in的結構體來儲存我們伺服器的ip和埠資訊
    struct sockaddr_in lockal;
    lockal.sin_family = AF_INET;//地址家族
    lockal.sin_port = htons(atoi(argv[2]));//埠號(我們輸入的是字串,所以先轉化為數字,然後在從網路轉化為本地)
    lockal.sin_addr.s_addr = inet_addr(argv[1]);//(點分十進位制轉化為四位元組的)的ip地址


	//將sock繫結ip和埠號
    if(bind(sock,(struct sockaddr*)&lockal,sizeof(lockal)) < 0)
    {
        printf("bine error!\n");
        return 3;
    }
    
    char buf[1024];
    struct sockaddr_in client;//建立一個儲存傳送端的地址資訊的sockaddr結構體
    while(1)
    {
        socklen_t len = sizeof(client);
        ssize_t s = recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len);//接收訊息,阻塞式
        if(s > 0)
        {
            buf[s] = 0;//將最後一個置為0,這樣防止讀錯
            printf("[%s|%d]: %s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);
        }
    }
}

client.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>


int main(int argc,char* argv[])
{
    if(argc != 3)//判斷輸入格式是否正確
    {
        printf("please enter:%s,ip,port.\n",argv[0]);
        return(1);
    }
	//建立一個套接字
    int sock = socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0)
    {
        printf("socket error!\n");
        return 2;
    }
	//儲存伺服器的地址資訊
    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]);


    char buf[1024];
    while(1)
    {
        printf("Please enter:");
        fflush(stdout);
        ssize_t s = read(0,buf,sizeof(buf)-1);//從標準輸入中讀取資料
        if(s > 0)
        {
            buf[s-1] = 0;
            sendto(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&server,sizeof(server));//傳送給伺服器端
        }
    }
}
效果圖:
伺服器端:
[[email protected] udp]$ ./server 192.168.43.146 8080
[192.168.43.146|57336]: 123
[192.168.43.146|57336]: 456
[192.168.43.146|57336]: 789
^C
[[email protected] udp]$ 
客戶端:
[[email protected] udp]# ./client 192.168.43.146 8080
Please enter:123
Please enter:456
Please enter:789
Please enter:^C                                              
[[email protected] udp]# 
由上面的結果我們可以瞭解到基於UDP網路程式設計的基本概念了吧。

相關推薦

UDP網路程式設計

UDP套介面是無連線的、不可靠的資料報協議;既然他不可靠為什麼還要用呢?其一:當應用程式使用廣播或多播時只能使用UDP協議;其二:由於他是無連線的,所以速度快。 因為UDP套介面是無連線的,如果一方的資料報丟失,那另一方將無限等待,解決辦法是設定一個超時。 建立UDP套介面時socket函式

Java網路程式設計2.UDP網路程式設計

UDP網路程式設計 1、UDP協議傳送資料 (1)UDP協議傳送資料的步驟: UDP協議傳送資料 A: 建立傳送端Socket物件 B: 建立資料,並把資料打包 C: 呼叫Socke

Java網路程式設計4.UDP網路程式設計之多執行緒優化

UDP網路程式設計之多執行緒優化——DatagramSocket類 1、UDP網路程式設計之多執行緒優化的思想 (1)一個執行緒實現客戶端——傳送資料 (2)一個執行緒實現伺服器端——接收資料

網路程式設計實驗一——TCP、UDP網路程式設計

一、實驗目的 1、利用TCP實現套接字通訊並理解TCP通訊的工作原理。 2、利用UDP實現套接字通訊並理解UDP通訊的工作原理。 實驗環境及準備 裝有Linux系統的計算機。 二、實驗原理 1、TCP/IP協議存在於OS中,網路服務通過OS提供。 2、應用程式要

UDP網路程式設計簡單實現

由於最近編寫的遊戲涉及到了網路程式設計這塊,所以特意記錄下。 UDP簡介 UDP協議的全稱是使用者資料報,在網路中它與TCP協議一樣用於處理資料報。在OSI模型中,UDP位於第四層——傳輸層,處於IP協議額上一層。UDP有不提供資料報分組、組裝以及不能對資料報排序的缺點。當報文傳送之後,是無

基於TCP網路程式設計(客戶機/伺服器模式的通訊)

客戶機程式 import java.net.*; import java.io.*; public class SClient { public static void main(String args[]) { String s=null; Socket c_soc

UDP網路程式設計時出現:Exception in thread "main" java.io.EOFException異常

import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; imp

Linuxc之基於UDP通訊程式設計

Client.c#include<stdio.h>  #include<stdlib.h>  #include<string.h>  #include<errno.h>  #include<sys/types.h>    #include<ne

window下udp網路程式設計存在的問題-socket error 10054解決方法

當使用udp套接字(比如A)呼叫recvfrom函式,會得到socketerror #10054 Connection reset by peer(python2.7反正有這個問題)的錯誤,原因是沒有其他程序在往本udp套接字傳送資料。解決方法是:先使用udp工具開啟udp

基於udp協議的字串計數【網路程式設計 - 基於udp協議的字串計數,C實現】

udp_server.c #include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") typedef struct sockaddr_in sockaddr_in ; typedef s

基於UDP協議的網路程式設計

        UDP協議即使用者資料報協議是一種面向無連線的協議,由於不需要建立連線,它的通訊效率高,實時性好,同時可靠性相對於TCP協議較低。UDP協議的主要作用是完成網路資料流和資料報之間的轉換--在資訊的傳送端,UDP協議將網路資料流封裝成資料報,

Visual C++網路程式設計經典案例詳解 第2章 Winsock網路程式開發流程 基於UDP的Sockets程式設計 UDP伺服器

vc建立控制檯程式視窗的應用程式 命名為 UDP伺服器UDPSever.cpp #include<winsock2.h> #include<stdio.h> #include<windows.h> #pragma comment(lib,

Visual C++網路程式設計經典案例詳解 第2章 Winsock網路程式開發流程 基於UDP的Sockets程式設計 UDP客戶端

在VC中建立UDP客戶端程式 控制檯 #include<winsock2.h> #include<stdio.h> #include<windows.h> #pragma comment(lib,"WS2_32.lib") int mai

JavaSE基礎(day21)(1)網路程式設計的常識 (2)基於tcp協議的程式設計模型(3)tcp協議和udp協議的比較 (4)基於udp協議的程式設計模型

默寫: 1.畫圖題 畫出所學IO流類之間的關係。 2.程式設計題 使用實現繼承的方式啟動一個執行緒,在該執行緒中每隔一秒列印一次當前系統時間,主執行緒等待5秒之後停止子執行緒。 今天內容: (1)網路程式設計的常識 (2)基於tcp協議的程式設計模型 (3)tcp協議和udp協議

網路程式設計——6. 基於UDP的伺服器端/客戶端

6.1 理解UDP UDP套接字的特點 跟寄信一樣,我寫好名字和地址,貼上郵票寄出去就好了。 郵寄過程的丟失或者損壞我都沒辦法保證,是一種不可靠的傳輸方式。但相比TCP,雖然可靠性差一些,但比TCP簡潔一些,速度也更快一些(在每次交換的資料量越小的情況下)。。

基於UDP網路程式設計實現簡單聊天室

import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; pu

linux網路程式設計之用socket實現簡單客戶端和服務端的通訊(基於UDP

1、sendto和recvfrom函式介紹 sendto(經socket傳送資料) 相關函式 send , sendmsg,recv , recvfrom , socket 表頭檔案 #include < sys/types.h >#includ

基於UDP的C/S網路程式設計模型(使用sendto和recvfrom函式)

#include #include #include #include #include #include #define MAX_CLIENT_NUM 10 #define LOG_ERROR(module_id, format...) \ do{ \ printf(format)

Linux C基於UDP網路程式設計

套接字(socket) socket是一種可以進行網路通訊的核心物件,它有一個唯一的識別符號,一般稱它為socket描述符——sockfd,可類比於檔案描述符fd,基於Linux下一切皆檔案的概念,所以sockfd也可以用read/write/close操作。

Java 基於UDP的Socket網路程式設計的入門及示例

前言:天吶!這兩天上班就像走鋼絲啊,老大家裡出事請假一週,手機關機,底層無人照看,機器又忙著定標,技術盲老闆事事問我這個底層小白。做人好難吶。。。還是祝願老大家裡沒有大礙吧,也保佑自己明天能安然度過。。保佑保佑。 原文出處:http://blog.c