socket是一種可以進行網路通訊的核心物件,它有乙個唯一的識別符號,一般稱它為socket描述符——sockfd,可模擬於檔案描述符fd,基於linux下一切皆檔案的概念,所以sockfd也可以用read/write/close操作。
socket函式:建立socket物件
int
socket
(int domain,
int type,
int protocol)
;
type:socket物件型別
sock_stream:資料流協議,tcp(面向連線的通訊協議)。特點是安全可靠,資料不會丟失,但速度慢。常用於安全性較高的場景;
sock_dgram:資料報協議,udp(面向無連線的通訊協議)。特點是速度快,資料可能丟失,安全性和可靠性與tcp相比不同。一般用於安全性要求不高但是對速度有要求的場景。
protocol:特殊協議
較少使用,一般直接寫0
返回值:成功返回非負描述符,失敗返回-1
網路通訊位址
struct sockaddr_in
int
bind
(int sockfd,
const
struct sockaddr *addr,socklen_t addrlen)
;
sockfd:socket物件的描述符,即socket函式的返回值
struct sockaddr* addr指定了想要繫結的ip和埠號,均用網路位元組序-即大端模式;
addrlen是前面struct sockaddr(與sockaddr_in等價)的長度
返回值: 成功返回0,失敗返回-1
connect函式:連線通訊目標
int
connect
(int sockfd,
const
struct sockaddr *addr,socklen_t addrlen)
;
個人計算機系統資料的儲存方式可能是大端,也可能是小端,網路通訊時需要的是大端資料,必須把資料轉換成大端。
uint32_t
htonl
(uint32_t hostlong)
;//功能:把32位的主機位元組序轉換成32位網路位元組序
uint16_t
htons
(uint16_t hostshort)
;//功能:把16位的主機位元組序轉換成16位網路位元組序
uint32_t
ntohl
(uint32_t netlong)
;//功能:把32位網路位元組序轉換成32位的主機位元組序
uint16_t
ntohs
(uint16_t netshort)
;//功能:把16位網路位元組序轉換成16位的主機位元組序
生成埠號:
埠號就是乙個16位的無符整數(065536),一般設定為大於1024的值,11023為保留埠號。
通常使用htons()函式來獲取埠號。
in_addr_t inet_addr
(const
char
*cp)
;
char
*inet_ntoa
(struct in_addr in)
;
ssize_t recvfrom
(int sockfd,
void
*buf, size_t len,
int flags,
struct sockaddr *src_addr, socklen_t *addrlen)
;
sendto函式:傳送資料到指定的目標
ssize_t sendto
(int sockfd,
const
void
*buf, size_t len,
int flags,
const
struct sockaddr *dest_addr, socklen_t addrlen)
;
udp程式設計模型:
程序a:建立socket物件->準備位址->繫結->接收資料和**的位址->原路返回資料->關閉socket。
程序b:建立socket物件->準備位址->向目標傳送資料->接收資料->關閉socket。
使用udp協議實現雙向傳輸資料(通過ip位址和埠,既可以與自己也可以與別人通訊)。
服務端
#include
#include
#include
#include
#include
#include
#include
typedef
struct sockaddr* sp;
intmain
(int argc,
const
char
* argb)
// 準備通訊位址(自己的)
struct sockaddr_in svr_addr =
,cli_addr =
; svr_addr.sin_family = af_inet;
svr_addr.sin_port =
htons
(7788);
svr_addr.sin_addr.s_addr =
inet_addr
("172.20.10.2");
socklen_t addrlen =
sizeof
(svr_addr)
;// 繫結位址與socket物件if(
bind
(svr_sock,
(sp)
&svr_addr,addrlen)
)char buf[
4096]=
;char buf2[
4096]=
; size_t buf_size =
sizeof
(buf)
;for(;
;)printf
("from:%s recv:%s bits:%d\n"
,inet_ntoa
(cli_addr.sin_addr)
,buf,ret_size)
;sprintf
(buf2,
",return:%s"
,inet_ntoa
(svr_addr.sin_addr));
strcat
(buf,buf2)
;// 返回資料
sendto
(svr_sock,buf,
strlen
(buf)+1
,0,(sp)
&cli_addr,addrlen);}
}
客戶端
#include
#include
#include
#include
#include
#include
#include
typedef
struct sockaddr* sp;
intmain
(int argc,
const
char
* argb)
setsockopt
(cli_sock,sol_socket,so_broadcast,
&is_broadcast,1)
;// 準備通訊位址(服務端)
struct sockaddr_in svr_addr;
svr_addr.sin_family = af_inet;
svr_addr.sin_port =
htons
(7788);
svr_addr.sin_addr.s_addr =
inet_addr
("172.20.10.2");
socklen_t addrlen =
sizeof
(svr_addr)
;char buf[
4096]=
; size_t buf_size =
sizeof
(buf)
;for(;
;)// 向伺服器傳送資料
sendto
(cli_sock,buf,
strlen
(buf)+1
,0,(sp)
&svr_addr,addrlen)
;// 從伺服器接收資料
size_t ret_size =
recvfrom
(cli_sock,buf,buf_size,0,
(sp)
&svr_addr,
&addrlen);if
(0>= ret_size)
printf
("from:%s recv:%s bits:%d\n"
,inet_ntoa
(svr_addr.sin_addr)
,buf,ret_size);}
}
基於Linux下的UDP程式設計
一.linux下udp程式設計框架 使用udp進行程式設計可以分為客戶端和伺服器端兩部分。1.伺服器端程式包括 建立套接字 將套接字位址結構進行繫結 讀寫資料 關閉套接字 2.客戶端程式包括 建立套接字 讀寫資料 關閉套接字 3.伺服器端和客戶端程式之間的差別 伺服器端和客戶端兩個流程之間的主要差別...
基於UDP的socket程式設計
轉貼自 udpsocket sockets 套接字 程式設計有三種,流式套接字 sock stream 資料報套接字 sock dgram 原始套接字 sock raw 基於udp的socket程式設計是採用的資料報套接字。在這個程式中,將兩個工程新增到乙個工作區。同時還要鏈結乙個ws2 32.li...
unix環境程式設計 UDP通訊
一 udp伺服器 程式設計的端一般步驟是 1 用函式socket 建立socket 第二個引數為sock dgram 2 用函式bind 繫結ip 位址 埠資訊 3 用函式recvfrom 接收資料 4 關閉網路連線 udp客戶端 程式設計的一般步驟是 1 建立乙個socket 用函式socket ...