windows vc socket程式設計

2021-06-29 16:40:24 字數 3954 閱讀 9311

分類: c/c++

一、原理

1.基於tcp協議的伺服器端程式流程:

1)建立套接字(socket)

2)繫結套接字(bind)

3)將套接字設為監聽,準備接收客戶請求(listen)

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

5)用返回的套接字與客戶端進行通訊(send/recv)

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

7)關閉套接字

2.基於tcp協議的客戶端程式流程

1)建立套接字(socket)

2)向伺服器發出連線請求(connect)

3)和伺服器端進行通訊(send/recv)

4)關閉套接字

在伺服器端呼叫accept函式時,程式就會等待客戶端呼叫connect函式發出連線請求,然後接收請求,於是

雙方就建立了連線,之後,伺服器端和客戶端就可以利用send和recv函式進行通訊了。

3.基於udp的伺服器端編寫

1)建立套接字(socket)

2)繫結(bind)

3)等待接收資料(recvfrom)

4)關閉套接字

4.基於udp的客戶端編寫

1)建立套接字(socket)

2)向伺服器傳送資料(sendto)

3)關閉套接字

在所有的套接字程式設計中第一步都是載入套接字型檔(wsastartup)

對於每乙個wsastartup函式的成功呼叫,在最後都要對應乙個wsacleanup呼叫。

二、原始碼:

1.tcp伺服器端:

#

include

#include

void main()if

( lobyte( wsadata.wversion )

!= 1 |

|hibyte( wsadata.wversion )

!= 1 )

socket socksrv=

socket

(af_inet

,sock_stream

,0);

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr=

htonl

(inaddr_any);

addrsrv.sin_family=

af_inet

;addrsrv.sin_port=

htons

(6000)

;bind

(socksrv,

(sockaddr*)

&addrsrv,

sizeof

(sockaddr))

;listen

(socksrv,5)

;sockaddr_in addrclient;

int len=

sizeof

(sockaddr);

while

(1)}

2.tcp客戶端:

#

include

#include

void main()if

( lobyte( wsadata.wversion )

!= 1 |

|hibyte( wsadata.wversion )

!= 1 )

socket sockclient=

socket

(af_inet

,sock_stream

,0);

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr=inet_addr(

"127.0.0.1");

addrsrv.sin_family=

af_inet

;addrsrv.sin_port=

htons

(6000)

;connect

(sockclient,

(sockaddr*)

&addrsrv,

sizeof

(sockaddr))

;char recvbuf[100]

;recv

(sockclient,recvbuf,100,0)

;printf

("%s\n"

,recvbuf)

;send

(sockclient,

"this is lisi"

,strlen

("this is lisi"

)+1,0)

;closesocket(sockclient)

;wsacleanup();

}

3.udp伺服器端

#

include

#include

void main()if

( lobyte( wsadata.wversion )

!= 1 |

|hibyte( wsadata.wversion )

!= 1 )

socket socksrv=

socket

(af_inet

,sock_dgram

,0);

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr=

htonl

(inaddr_any);

addrsrv.sin_family=

af_inet

;addrsrv.sin_port=

htons

(6000)

;bind

(socksrv,

(sockaddr*)

&addrsrv,

sizeof

(sockaddr))

;sockaddr_in addrclient;

int len=

sizeof

(sockaddr);

char recvbuf[100]

;recvfrom

(socksrv,recvbuf,100,0,

(sockaddr*)

&addrclient,

&len)

;printf

("%s\n"

,recvbuf)

;closesocket(socksrv)

;wsacleanup();

}

4.udp客戶端

#

include

#include

void main()if

( lobyte( wsadata.wversion )

!= 1 |

|hibyte( wsadata.wversion )

!= 1 )

socket sockclient=

socket

(af_inet

,sock_dgram

,0);

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr=inet_addr(

"127.0.0.1");

addrsrv.sin_family=

af_inet

;addrsrv.sin_port=

htons

(6000)

;sendto

(sockclient,

"hello"

,strlen

("hello"

)+1,0,

(sockaddr*)

&addrsrv,

sizeof

(sockaddr))

;closesocket(sockclient)

;wsacleanup();

}

靜態聯編與動態聯編

在c 中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式 來處理這個函式呼叫。這種把函式呼叫與適當的函式 相對應的動作,叫做聯編。聯編分為靜態聯編和動態聯編。在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。在編譯階...

靜態聯編和動態聯編

聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...

靜態聯編和動態聯編

聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...