C 網路程式設計之TCP UDP

2021-06-25 10:04:02 字數 4667 閱讀 3343

網路位元組順序:

tcp/ip

採用16/32

位高位先存格式

tcp/ip

網路應用中,通訊的兩個程序主要採用

c/s模式。

伺服器要先啟動,並根據請求提供相應的服務:

1、開啟乙個通訊通道訂告知本地主機,它願意在某一位址和埠上接受客戶請求;

2、等待客戶請求到達該埠;

3、接受到重複服務請求,處理該請求並傳送應答訊號。接收到併發服務請求,要急活乙個新的程序(或執行緒)來處理這個客戶請求。服務完成後關閉此新程序與客戶的通訊鏈路並終止;

4、返回第二步,等待新的請求;

5關閉伺服器。

客戶方:

1、開啟乙個通訊通道,並連線到無**所在主機的特定埠;

2、想伺服器傳送請求報文,等待並接受應答,繼續提出請求。

3請求結束後青碧通道並終止。

套接字型別: 1、

流式套接字(

sock_stream):

基於tcp 2、

資料報套接字(

sock_dgram

):基於

udp

3、原始套接字(

sock_raw)

基於tcp

的socket

程式設計:

伺服器端: 1、

用socket

函式建立套接字 2、

將套接字繫結到乙個本地位址和埠上(

bind)

3、將套接字設為監聽模式,準備接受客戶請求(

listen);

4、等待客戶請求到來:當請求到來後接受連線請求,返回乙個新的對應此次連線的套接字(

accep)

5、用返回的套接字和客戶端進行通訊(

send/recv)

6、返回,等待另一客戶請求 7、

關閉套接字。

客戶端: 1、

建立套接字(

socket)

2、向伺服器傳送連線請求(

connect)

3、和伺服器進行通訊(

send/recv)

4、關閉套接字。 基於

udp的

socket程式設計

伺服器端: 1、

建立套接字(

socket)

2、將淘金誒子繫結到乙個本地位址和埠上(

bind)

3、等待接受資料(

recvfrom)

4、關閉套接字。

客戶端: 1、

建立套接字(

socke)

2、向務器傳送資料(

sendto)

3、關閉套接字。

具體事例講解:

首先載入

wsastartup

套接字型檔。

intwsastartup(

word wversionrequested,

lpwsadata lpwsadata);

載入完套接字型檔後需要建立套接字(

socket

socket

socket(

int af

,//指定位址族,對與

tcp/ip

只能是af_inet

int type

,//指定

socket

型別,對與

1.1版本,只支援

sock_stream

和sock_gram

int protocol

//if 0,

自動選擇乙個合適的協議

); 

繫結本地位址和埠

int

bind(

socket s

,

const struct sockaddr* name

,

int namelen

);
struct sockaddr_in ;
typedef struct in_addr  s_un_b;

struct s_un_w;

u_long s_addr;

} s_un

;

} in_addr;
u_long

htonl(

u_long hostlong

);//

the htonl function converts a u_long from host to tcp/ip network byte order (which is big endian).

u_short

htons(

u_short hostshort

);

the htons function converts a u_short from host to tcp/ip network byte order (which is big-endian).

inet_addr()

函式將點分十進位制的

ip位址轉換成

u_long型別

用inet_ntoa()

完成相反的轉換

可以講ip位址指定為

inaddr_any,

允許套接字想任何分配給本地機器的

ip位址傳送資料

繫結完套接字後需要呼叫

listen

把套接字設定為監聽模式

int

listen(

socket s

,

int backlog

//等待連線佇列的最大值

);

然後等待連線請求的到來。

while(1

) ;

socket

accept(

socket s

,

struct sockaddr* addr

,//接受發起連線的客戶端位址

int* addrlen

);
接受到客戶請求後就可以傳送資料了

int

send(

socket s

,

const char* buf

,

int len

,

int flags

);
傳送完資料後可以呼叫接受函式接收資料

int

recv(

socket s

,

char* buf

,

int len

,

int flags

);
在執行

winsocket

程式要包含

winsock2.h

需要連線

ws2_32.lib

庫檔案。

下面分析客戶端的程式:

首先也應建立套接字

socket

對於客戶端不需要繫結,直接連線伺服器端。

int

connect(

socket s

,

const struct sockaddr* name

,//要建立連線的位址資訊

int namelen

);
在本地機器上可以用

127.0.0.1

,這是乙個迴路位址。

最後呼叫

closesocket() 和

wsacleanup

()。

udp的

socket

程式與tcp

基本類似。

建立套接字

socket

繫結套接字

bind 用

recvfrom

函式接受資料

int

recvfrom(

socket s

,

char* buf

,//用來接受資料

int len

,//buf

長度

int flags

,

struct sockaddr* from

,//接收傳送資料方的位址資訊

int* fromlen

);

下面來看基於

udp的客戶端的程式:

首先建立套接字;

這裡不需要繫結,直接傳送資料。

int

sendto(

socket s

,

const char* buf

,//傳送的資料

int len

,//資料的長度

int flags

,//它的值影響傳送資料的行為,一般設為

0

const struct sockaddr* to

,//設定目的套接字的位址資訊

int tolen

);

C 網路程式設計之TCP UDP

最近因為需要用到網路程式設計的知識點,看了這篇部落格,感覺非常有用,對tcp udp描述的很通熟易懂 基於tcp協議的socket通訊類似於b s架構,面向連線,但不同的是伺服器端可以向客戶端主動推送訊息。使用tcp協議通訊需要具備以下幾個條件 1 建立乙個套接字 socket 2 繫結伺服器端ip...

unix網路程式設計之一TCP UDP

網路通訊中最常用的就是tcp udp。2種協議個有一些特點如下 udp是一種簡單的傳輸協議。應用程式寫資料到udp套介面。然後由它封裝成ipv4或ipv6的資料報,再傳送到目的位址。它不提供可靠性。它與伺服器不存在長期的連線關係。tcp是一種面向連線的協議。提供 可靠性 先連線,再傳輸資料。傳送資料...

java學習路程之網路程式設計 TCP UDP

public class demo01 1.tcp協議 tcp協議是面向連線的通訊協議,即在傳輸資料前先在傳送端和接收端建立邏輯連線,然後再傳輸資料,它提供了兩台計算機之間可靠無差錯的資料傳輸。在tcp連線中必須要明確客戶端與伺服器端,由客戶端向服務端發出連線請求,每次連線的建立都需要經過 三次握手...