Socket通訊示例

2021-09-25 10:31:50 字數 4434 閱讀 4889

一 最簡例程實現socket網路傳輸

伺服器端( 比客戶端先執行)

vi socket_server.c

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 

12 #define servport 3333 /* port */

/*系統預設值佇列大小為5*/

13 #define backlog 5 /* max client connet queue*/

14 15 int main ()

16 else

48 }

49 }

客戶端

vi socket_client.c

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 

9 #define servport 3333

10 11 int main ()

20 server_address.sin_family = af_inet;

21 server_address.sin_port = htons(servport);

/* 遠端伺服器 ip */

22 server_address.sin_addr.s_addr = inet_addr("192.168.2.167");

23 bzero(&(server_address.sin_zero),8);

24 25 if(connect(clientfd,(struct sockaddr *)&server_address,sizeof(struct sockaddr)) == -1)

29 30 int data;

31 32 write(clientfd,&data,sizeof(data));

33 printf("write %d\n",data);

34 read(clientfd,&data,sizeof(data));

35 printf("read %d\n",data);

36 sleep(2);

37 38 close(clientfd);

39 }

二 所涉及到的函式名詞解釋

1. include檔案

○ #include /* gai_strerror */

○ #include 2. socket是什麼?

a. socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面

user process

socket

tcp/udp

ip ethernet

3. socket的基本函式

○ socket (伺服器/客戶端)返回乙個socket描述符(類似於open函式)

§ int socket(int domain,int type,int protocol)

□ domain:協議族(family),常用af_inet(32位ipv4+16位port),af_inet6

□ type:socket型別,常用sock_stream(tcp)、sock_dgram(udp)

□ protocol:協議,常用ipproto_tcp、ipptoro_udp

○ bind 伺服器繫結到指定位址

§ int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

□ sockfd:即socket描述符(socket函式返回值)

○ listen伺服器監聽

§ int listen(int sockfd,int backlog)

□ 函式作用:將套接字(sockfd)變成被動的連線監聽套接字(被動等待客戶端的連線),並且將該套接字和套接字對應的連線佇列長度告訴linux核心。

□ backlog:為相應socket可以排隊的最大連線個數(未完成連線佇列+已完成連線佇列),預設值為5

○ connect客戶端請求連線

§ int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

○ accept伺服器阻塞等待client連線

§ int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen)

□ 從處於established狀態的連線佇列頭部取出乙個已完成的連線(client connet 成功),如果這個佇列沒有已經完成的連線,accept()函式就會阻塞。tcp的連線佇列滿後,linux不會如書中所說的拒絕連線,只是有些會延時連線。

□ sockfd:為伺服器的socket描述字

□ 返回值:是核心自動生成的乙個全新的描述字,代表與client的tcp連線

§ 伺服器僅僅只建立乙個監聽socket描述字,而為每個連線客戶建立乙個已連線socket描述字,服務結束則關閉。

○ read、write(伺服器/客戶端)資料傳輸

§ ssize_t read(int fd,void *buf,size_t count)

§ ssize_t write(int fd,const void *buf,size_t count)

§ ssize_t sendto(int sockfd,const void *buf,size_t len,int flags,const struct sockaddr *dest_addr,socklen_t addrlen)

□ len:資料報長度

□ flags:指定傳送形式,一般為0

□ 返回值:已傳送的位元組數

§ ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen)

○ close(伺服器/客戶端)關閉socketfd

§ int close(int fd)

□ 完成了連線後的讀寫操作,就要關閉相應的socket描述字

4. 相關函式

○ getaddrinfo 將主機和服務轉換到socket位址

§ int getaddrinfo(const char *restrict nodename,const char *restrict servname,const struct addrinfo **restrict hints,struct addrinfo **restrict res)

□ servname:十進位制埠號或服務名稱ftp,http

□ hints:獲取資訊要求設定

□ res:獲取資訊結果

□ 返回值:返回乙個addrinfo結構體由套接字函式直接使用

○ freeaddrinfo

§ void freeaddrinfo(struct addrinfo *ai)

○ getnameinfo 將socket位址轉換到主機和服務

§ int getnameinfo(const struct sockaddr *sa,socklen_t salen,char *host,size_t hostlen,char *serv,size_t servlen,int flags)

○ 位址轉換

§ int inet_aton(const char *cp, struct in_addr *inp) 字串轉32整數表示

§ char *inet_ntoa(struct in_addr in) 整數轉字串

○ 網路位元組序統一採用 big endian 先傳低位元組

§ 從主機轉網路序

□ htons(unsigned short)

□ htonl (unsigned long)

® h:host 本地主機

® to:

® n:net網路的意思

® l: unsigned long

§ 從網路序轉換到主機序

□ ntohs (unsigned short)

□ ntohl(unsigned long)

§ 網路中標識一台主機可以用ip位址 ,也可用主機名

□ struct hostent *gethostbyname( const char *hostname)

program flow chart 模型圖

簡單socket通訊示例

int socket int domain,int type,int protocol domain 位址族 af unix,af local local communication unix域協議族 af inet ipv4 internet protocols af inet6 ipv6 int...

windows下的Socket通訊示例一

客戶端傳送資料,伺服器端接收資料 先執行server.exe,再執行client.exe 伺服器端server.cpp include include pragma comment lib,ws2 32.lib 載入ws2 32.dll int main 建立套接字 socket servsock ...

非同步Socket通訊的乙個簡單示例

最近要抓緊時間做talk!專案,看到網上有個簡單非同步通訊的例子,可惜是用vb寫的,我把它用c 改寫了一遍,加了點小功能。語言 c 軟體 vs.2003 傳送端 private void button1 click object sender,system.eventargs e 接受端 publi...