網絡編程之 TCP / UDP 及其流程比較

TCP與UDP的區別

1、基于連接與無連接
2、對系統資源的要求(TCP較多UDP少
3、UDP程序結構較簡單 流模式與數據報模式
4、TCP保證數據正確性UDP可能丟包
5、TCP保證數據順序UDP不保證

具體編程時的區別

1、socket()的參數不同
2、UDP Server不需要調用listen和accept
3、?UDP收發數據用sendto/recvfrom函數 TCP:地址信息在connect/accept時確定
UDP:在sendto/recvfrom函數中每次均 需指定地址信息 UDP:shutdown函數無效

部分滿足以下幾點要求時,應該采用UDP 面向數據報方式

1、網絡數據大多為短消息
2、擁有大量Client 對數據安全性無特殊要求
3、?網絡負擔非常重,但對響應速度要求高
4、UDP協議是不可靠的網絡協議,它在通信兩端各建立一個Socket,但是這兩個Socket之間沒有虛擬鏈路,這兩個Socket只負責發送和接收數據報的對象!
例子:ICQ、ping

???面向連接的TCP的流方式

服務器程序流程(多進程):

1、程序初始化
2、填寫本機地址信息
3、綁定并監聽一個固定的端口
4、收到Client的連接后建立一個socket連接 產生一個新的進程與Client進行通信和信息處理
5、子通信結束后中斷與Client的連接

客戶端程序流程:

1、程序初始化
2、填寫服務器地址信息
3、?連接服務器
4、與服務器通信和信息處理
5、通信結束后斷開連接

服務器代碼

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <sys/wait.h>

#define MYPORT 3490????????????????

#define BACKLOG 10????????????????

void main() {

int sockfd, new_fd;????????????

struct sockaddr_in sa;???//本機地址?????

struct sockaddr_in their_addr;//遠程地址

int sin_size;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

perror("socket");

exit(1);

}

sa.sin_family = AF_INET;

sa.sin_port = htons(MYPORT);????????

sa.sin_addr.s_addr = INADDR_ANY;????

bzero(&(sa.sin_zero), 8);????????????

if (bind(sockfd, (struct sockaddr *)&sa, sizeof(sa)) == -1) {

perror("bind");

exit(1);

}

if (listen(sockfd, BACKLOG) == -1) {

perror("listen");

exit(1);

}

?

while(1) {

sin_size = sizeof(struct sockaddr_in);

new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size))

if (new_fd == -1) {

perror("accept");

continue;

}

printf(”Got connection from %sn", inet_ntoa(their_addr.sin_addr));

if (fork() == 0) {

?

if (send(new_fd, "Hello, world! n", 14, 0) == -1)

perror("send");

close(new_fd);

exit(0);

}

close(new_fd);

?

while(waitpid(-1,NULL,WNOHANG) > 0);

}

}

?

?

客戶端代碼

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define PORT 3490

#define MAXDATASIZE 100

int main(int argc, char *argv[])

{

int sockfd, numbytes;

char buf[MAXDATASIZE];

struct hostent *he;

struct sockaddr_in their_addr;//服務器地址

if (argc != 2) {

fprintf(stderr,"usage: client hostnamen");

exit(1);

}

?

if ((he=gethostbyname(argv[1])) == NULL) {

?

herror("gethostbyname");

exit(1);

}

if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {

perror("socket");

exit(1);

}

their_addr.sin_family = AF_INET;

their_addr.sin_port = htons(PORT);

their_addr.sin_addr = *((struct in_addr *)he->h_addr);

bzero(&(their_addr.sin_zero), 8);

if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {

perror("connect");

exit(1);

}

if ((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1) {

perror("recv");

exit(1);

}

buf[numbytes] = '';

printf("Received: %s",buf);

close(sockfd);

return 0;

}

?

?

服務器程序流程(單進程):

1、程序初始化
2、填寫本機地址信息
3、綁定一個固定的端口
3、收到Client的數據報后進行處理與通信
4、通信結束后斷開連接

客戶端程序流程:

1、程序初始化
2、填寫服務器地址信息
3、連接服務器 與服務器通信和信息處理 //發送報文的方式建立與服務器的聯系
4、通信結束后斷開連接

UDP方式下服務器與客戶端程序差別不大,僅第三步不同。

?

服務器

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <sys/wait.h>

#define MYPORT 3490

void main()

{

int sockfd;

struct sockaddr_in my_addr;

struct sockaddr_in their_addr;

int sin_size, retval;

char buf[128];

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {

perror("socket");

exit(1);

}

my_addr.sin_family = AF_INET;

my_addr.sin_port = htons(MYPORT);

my_addr.sin_addr.s_addr = INADDR_ANY;

bzero(&(my_addr.sin_zero), 8);

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1) {

perror("bind");

exit(1);

}

?

while(1) {

retval = recvfrom(sockfd, buf, 128, 0, (struct sockaddr *)&their_addr, &sin_size);//獲取遠程主機的報文,并解析

printf("Received datagram from %sn",inet_ntoa(their_addr.sin_addr));

if (retval == 0) {

perror (“recvfrom");

close(sockfd);

break;

}

retval = sendto(sockfd, buf, 128, 0, (struct sockaddr *)&their_addr, sin_size);

}

}

?

客戶端

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define PORT 3490

#define MAXDATASIZE 100

int main(int argc, char *argv[])

{

int sockfd, numbytes, sin_size;

char buf[MAXDATASIZE] = “Hello, world!”;

struct hostent *he; //

struct sockaddr_in their_addr;//服務器地址

if (argc != 2) {

fprintf(stderr,"usage: client hostnamen");

exit(1);

}

?

if ((he=gethostbyname(argv[1])) == NULL) {

herror("gethostbyname");

exit(1);

}

if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1) {

perror("socket");

exit(1);

}

their_addr.sin_family = AF_INET;

their_addr.sin_port = htons(PORT);

their_addr.sin_addr = *((struct in_addr *)he->h_addr);

bzero(&(their_addr.sin_zero), 8);

numbytes = sendto(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr,sizeof(their_addr));//向服務器發送任一報文

if (numbytes == -1) {

perror(“sendto");

exit(1);

}

printf(“Send: %s",buf);

numbytes = recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr, &sin_size);

if (numbytes == -1) {

perror("recvfrom");

exit(1);

}

buf[numbytes] = '';

printf("Received: %s",buf);

close(sockfd);

return 0;

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254108.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254108.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254108.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Tomcat在Linux上的安裝與配置

Tomcat在Linux上的安裝與配置 1、 jdk下載地址&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html tomcat下載地址:http://tomcat.apache.org/download-70.cg 2、jdk安裝與配置.&#xff08;rpm包&#xff09; (1)jdk安裝…

Spring在3.1版本后的bean獲取方法的改變

xml配置不變&#xff0c;如下 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

使用halcon選擇點擬合成直線求直線角度

原圖 源碼 read_image (Image, 0.bmp) dev_clear_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image)binary_threshold (Image, Region, max_separability, dark, UsedThreshold) connection (Region, ConnectedRegions) select_s…

Linux網絡/firewalld和netfilter/netfilter/iptables語法

為什么80%的碼農都做不了架構師&#xff1f;>>> linux網絡相關 查看網卡網絡信息 ifconfig 命令查看網卡網絡信息&#xff0c;比如ip、網關、子網掩碼等&#xff0c;但是安裝centos7的版本或者某些未知原因&#xff0c;此命令提示找不到&#xff0c;我們可以使用Yu…

Chrome開發者工具詳解(4)-Profiles面板

Chrome開發者工具詳解(4)-Profiles面板 如果上篇中的Timeline面板所提供的信息不能滿足你的要求&#xff0c;你可以使用Profiles面板&#xff0c;利用這個面板你可以追蹤網頁程序的內存泄漏問題&#xff0c;進一步提升程序的JavaScript執行性能。 概述 當前使用的Chrome最新版為…

etcd raft library設計原理和使用

早在2013年11月份&#xff0c;在raft論文還只能在網上下載到草稿版時&#xff0c;我曾經寫過一篇blog對其進行簡要分析。4年過去了&#xff0c;各種raft協議的講解鋪天蓋地&#xff0c;raft也確實得到了廣泛的應用。其中最知名的應用莫過于etcd。etcd將raft協議本身實現為一個l…

halcon通過點擬合圓形,鼠標選點

原圖 源碼 read_image (Image, 0.bmp) dev_clear_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image)binary_threshold (Image, Region, max_separability, dark, UsedThreshold) connection (Region, ConnectedRegions) select_s…

JDBC事務--軟件開發三層架構--ThreadLocal

JDBC事務--軟件開發三層架構--ThreadLocal 一.JDBC事務 1.概述: 事務是指邏輯上的一組操作!這一組操作,通常認為是一個整體,不可拆分! 特點:同生共死;事務內的這一組操作要么全部成功,要么全部失敗! 作用:保證邏輯操作的完整性,安全性! 2.使用(3種方式) 1)面向數據庫,使用S…

LINUX多播編程

一.單播&#xff0c;廣播和多播 1.單播用于兩個主機之間的端對端通信&#xff0c;廣播用于一個主機對整個局域網上所有主機上的數據通信。單播和廣播是兩個極端&#xff0c;要么對一個主機進行通信&#xff0c;要么對整個局域網上的主機進行通信。實際情況下&#xff0c;經常需…

cas單點登錄搭建

Cas Server下載&#xff1a;http://developer.jasig.org/cas/ Cas Client下載&#xff1a;http://developer.jasig.org/cas-clients/ 測試環境&#xff1a; jdk&#xff1a;java version "1.8.0_60" tomcat&#xff1a;apache-tomcat-7.0.65 mysql&#xff1a;mysql5…

新CIO:Mark Schwartz認為的領先IT

美國公民及移民服務局前任CIO&#xff0c;現任AWS企業戰略師Mark Schwartz在倫敦舉行的DevOps企業峰會上介紹了什么是領先的IT。\\Schwartz介紹說&#xff0c;老舊、傳統的模型將業務和IT完全分開&#xff0c;他又提出了一種新的模型&#xff0c;在這種模型中&#xff0c;CIO擔…

689D Magic Odd Square 奇數幻方

1 奇數階幻方構造法 (1) 將1放在第一行中間一列; (2) 從2開始直到nn止各數依次按下列規則存放&#xff1a;按 45方向行走&#xff0c;向右上&#xff0c;即每一個數存放的行比前一個數的行數減1&#xff0c;列數加1 (3) 如果行列范圍超出矩陣范圍&#xff0c;則回繞。例如1在第…

Java單例的常見形式

2019獨角獸企業重金招聘Python工程師標準>>> Java單例的常見形式 本文目的&#xff1a;總結Java中的單例模式 本文定位&#xff1a;學習筆記 學習過程記錄&#xff0c;加深理解&#xff0c;便于回顧。也希望能給學習的同學一些靈感 一、非延遲加載單例類 public cla…

運動控制卡的基類函數與實現例子

基類 namespace MotionCardDll {public abstract class IMotionCard{public Int32 m_Mode;public Int32 m_BoardId;//Card 號public Int32 m_Card_name;public Int32 m_StartAxisID

U-Boot啟動過程完全分析

1.1 U-Boot 工作過程 U-Boot啟動內核的過程可以分為兩個階段&#xff0c;兩個階段的功能如下&#xff1a; &#xff08;1&#xff09;第一階段的功能 硬件設備初始化 加載U-Boot第二階段代碼到RAM空間 設置好棧 跳轉到第二階段代碼入口 &#xff08;2&#x…

CJOJ 2171 火車站開飯店(樹型動態規劃)

CJOJ 2171 火車站開飯店&#xff08;樹型動態規劃&#xff09; Description 政府邀請了你在火車站開飯店&#xff0c;但不允許同時在兩個相連的火車站開。任意兩個火車站有且只有一條路徑&#xff0c;每個火車站最多有 50 個和它相連接的火車站。 告訴你每個火車站的利潤&#…

JavaWeb總結(十五)

AJAX&#xff08;Asynchronous JavaScript and XML&#xff08;異步的 JavaScript 和 XML&#xff09;&#xff09; AJAX的作用是什么&#xff1f; 在無需重新加載整個網頁的情況下&#xff0c;能夠更新部分網頁的技術 是一種用于創建快速動態網頁的技術 通過在后臺與服務器進行…

工業相機基類與實現

基類 namespace Cameron {//相機參數public struct CamPara{public int DeviceID; //設備描述public string Name;public int WorkMode; //工作類型,0為連續模式,1為觸發模式public float Expours

物聯網技術周報第 143 期: Unity 3D 和 Arduino 打造虛擬現實飛行器

新聞 \\\\t《西門子、阿里云簽約助力中國工業物聯網發展》德國工業集團西門子和中國阿里巴巴集團旗下的云計算公司阿里云&#xff19;日在柏林簽署備忘錄&#xff0c;共同推進中國工業物聯網發展。根據備忘錄內容&#xff0c;西門子和阿里云將發揮各自技術和行業優勢&#xff…

不同平臺下 sleep區別用法

應用程序&#xff1a; #include <syswait.h> usleep(n) //n微秒 Sleep&#xff08;n&#xff09;//n毫秒 sleep&#xff08;n&#xff09;//n秒 驅動程序&#xff1a; #include <linux/delay.h> mdelay(n) //微秒milliseconds 其實現 #ifdef notdef #define mdelay…