分類: 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 中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式 來處理這個函式呼叫。這種把函式呼叫與適當的函式 相對應的動作,叫做聯編。聯編分為靜態聯編和動態聯編。在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。在編譯階...
靜態聯編和動態聯編
聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...
靜態聯編和動態聯編
聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...