基於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