linux中socket的基本用法 UDP篇

2021-10-01 03:55:43 字數 3766 閱讀 6517

先記錄下關於udp的基礎知識點

udp的基礎知識點

包括的標頭檔案和常用的函式

#include

#include

1.socket函式原型

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

功能:建立乙個socket

引數說明:

引數1:設定網路通訊的域 這裡的af_inet 表示ipv4的網路型別;使用af_inet6的網路型別

引數2:socket的資料型別 這裡的sock_dgram表示udp型別;使用sock_stream表示tcp型別

引數3:協議型別 一般置為0

例子:int sockfd = socket(af_inet,sock_dgram,0);

2.sendto函式原型

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

const struct sockaddr *dest_addr, socklen_t addrlen);

功能:sendto傳送指令給指定的伺服器

引數說明:

引數1:監聽埠的套接字檔案描述符 通過socket返回

引數2:傳送緩衝區

引數3:緩衝區的大小

引數4:一般置為0

引數5:sockaddr結構體位址 這個結構體包含 ip位址 埠號 網路通訊域

引數6:引數5的長度 可以用sizeof(sockaddr_in)獲取

例子:int sendlength = sendto(sockfd,buffer,strlen(buffer),0, (struct sockaddr*)addr, len);

3.recvfrom函式原型

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

struct sockaddr *src_addr, socklen_t *addrlen);

功能:接收服務端返回的資訊

引數說明:

第乙個引數sockfd:正在監聽埠的套介面檔案描述符,通過socket獲得

第二個引數buf:接收緩衝區,往往是使用者定義的陣列,該陣列裝有接收到的資料

第三個引數len:接收緩衝區的大小,單位是位元組

第四個引數flags:填0即可

第五個引數src_addr:指向傳送資料的主機位址資訊的結構體,也就是我們可以從該引數獲取到資料是誰發出的

第六個引數addrlen:表示第五個引數所指向內容的長度

返回值:成功:返回接收成功的資料長度 失敗 返回-1

進行udp通訊的時候 埠是一定要一致的 否則無法收到訊息

//step2 給sockaddr_in結構體賦值(ip位址 埠號 網路通訊域)

bzero(&addr,sizeof(struct sockaddr_in)); 

addr.sin_family=af_inet; 

addr.sin_port=htons(server_port);

= htonl("139.224.117.109");

//inet_aton("139.224.117.109", &addr.sin_addr);

if(inet_aton("127.0.0.1",&addr.sin_addr)<0)

例子:struct sockaddr_in addr; 

bzero(&addr,sizeof(struct sockaddr_in));

addr.sin_family = af_inet; 

addr.sin_port = htons(server_port);

addr.sin_addr.s_addr = inet_addr("127.0.0.1");

udp的server例子:

/*

2019-11-30 11:24:14

乙個簡單的udp server的實現

*/#include #include #include #include #include #include #include #include #include #include #define server_port 9989

#define max_msg_size 1024

int main()

//step2 給sockaddr_in結構體賦值

bzero(&addr,sizeof(struct sockaddr_in));

addr.sin_family=af_inet;

addr.sin_addr.s_addr=htonl(inaddr_any);

addr.sin_port=htons(server_port);

//step3 繫結sock

if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)

while(1)

} //step5 當接收到的值異常的時候 結束這個流程 釋放socket

close(sockfd);

}

udp client的例子

/*

2019-11-30 11:32:19

乙個簡單的udp的client

*/#include #include #include #include #include #include #include #include #include #define server_port 9999

#define max_buf_size 1024

int main()

//step2 對sockaddr_in進行賦值

bzero(&addr,sizeof(struct sockaddr_in));

addr.sin_family=af_inet;

addr.sin_port=htons(server_port);

addr.sin_addr.s_addr = inet_addr("127.0.0.1");

while(1)

//step4 結束訊息

close(sockfd);

}

編譯就使用gcc來進行編譯就好了

gcc -o client client.c

gcc -o server server.c

執行結果:

這裡記錄乙個問題(乙個警告)

example_tcp_client.c:53:5: warning: implicit declaration of function 『write』 [-wimplicit-function-declaration]

write(sockfd,buffer,strlen(buffer)); 

^example_tcp_client.c:56:5: warning: implicit declaration of function 『close』 [-wimplicit-function-declaration]

close(sockfd); 

這個嚴格上說不算錯誤 只是警告,這裡加上標頭檔案 #include 即可解決此問題

Java中Socket通訊的基本方法

建立socket連線到server socket chatsocket new socket 127.0.0.1 5000 建立socket的時候需要用到兩個重要的引數,乙個是ip位址,另外乙個是埠號。ip位址可以理解成網路中特定位置的計算機 伺服器相當於一台連續工作的計算機 埠號對應於計算機中特定...

Linux中檢視socket狀態

首先給大家分享乙個巨牛巨牛的人工智慧教程,是我無意中發現的。教程不僅零基礎,通俗易懂,而且非常風趣幽默,還時不時有內涵段子,像看 一樣,哈哈 我正在學習中,覺得太牛了,所以分享給大家!點這裡可以跳轉到教程 linux中檢視socket狀態 cat proc net sockstat 這個是ipv4的...

Linux中檢視socket狀態

linux中檢視socket狀態 cat proc net sockstat 這個是ipv4的 sockets used 137 tcp inuse 49 orphan 0 tw 3272 alloc 52 mem 46udp inuse 1 mem 0raw inuse 0 frag inuse ...