日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux中使用recvfrom函數(shù)接收數(shù)據(jù)(recvfrom函數(shù)linux)

Linux是一個強大而靈活的操作系統(tǒng),它具有許多不同的網(wǎng)絡編程接口和API,以便開發(fā)者們能夠輕松地構建穩(wěn)健的網(wǎng)絡應用程序。其中一個非常重要的API是recvfrom函數(shù),它允許系統(tǒng)在網(wǎng)絡上收到數(shù)據(jù)并讀取這些數(shù)據(jù)。在這篇文章中,我們將深入了解如何在,并展示一些實際的示例。

網(wǎng)站建設哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、重慶小程序開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了威遠免費建站歡迎大家使用!

recvfrom函數(shù)概述

recvfrom函數(shù)允許我們從網(wǎng)絡套接字中接收數(shù)據(jù),其使用如下:

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

其中,sockfd是待接受數(shù)據(jù)的套接字描述符,buf是指接收數(shù)據(jù)的緩沖區(qū),len是緩沖區(qū)的大小,flags是操作標志,src_addr是指向發(fā)送端套接字地址結構的指針,addrlen是指向發(fā)送端套接字地址結構長度的指針。

recvfrom函數(shù)返回已接收到的字節(jié)數(shù),如果失敗,則返回-1。

如何使用recvfrom函數(shù)接收數(shù)據(jù)?

下面是一些在的示例:

1. 接收UDP報文

在使用UDP協(xié)議進行通信時,我們可以使用recvfrom函數(shù)來接收UDP數(shù)據(jù)報文。下面是一個簡單的示例代碼:

“`

#include

#include

#include

#include

#define PORT 8080

int mn() {

int udp_socket, n;

char buffer[1024];

struct sockaddr_in server_address, client_address;

socklen_t addr_length = sizeof(client_address);

// 創(chuàng)建UDP套接字

if ((udp_socket = socket(AF_INET, SOCK_DGRAM, 0))

perror(“socket creation fled”);

return 1;

}

memset(&server_address, 0, sizeof(server_address));

memset(&client_address, 0, sizeof(client_address));

// 為服務器配置地址結構

server_address.sin_family = AF_INET;

server_address.sin_addr.s_addr = INADDR_ANY;

server_address.sin_port = htons(PORT);

// 將套接字綁定到服務器地址

if (bind(udp_socket, (const struct sockaddr *)&server_address, sizeof(server_address))

perror(“bind fled”);

return 1;

}

printf(“Listening on port %d…\n”, PORT);

while (1) {

// 接收UDP數(shù)據(jù)報文

n = recvfrom(udp_socket, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_address, &addr_length);

printf(“Received from %s:%d:\n”, inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port));

printf(“%s”, buffer);

memset(&buffer, 0, sizeof(buffer));

}

close(udp_socket);

return 0;

}

“`

該代碼從指定的端口(端口號為8080)接收UDP數(shù)據(jù)報文,并輸出發(fā)送方的IP地址和端口號。

2. 接收TCP流

在使用TCP協(xié)議進行通信時,我們可以使用接收函數(shù)recv(accept函數(shù)已在之前調(diào)用完成)和非阻塞接收函數(shù)recvfrom。下面是一個簡單的示例代碼:

“`

#include

#include

#include

#include

#define PORT 8080

int mn() {

int tcp_socket, new_socket, n;

char buffer[1024];

struct sockaddr_in server_address, client_address;

socklen_t addr_length = sizeof(client_address);

// 創(chuàng)建TCP套接字

if ((tcp_socket = socket(AF_INET, SOCK_STREAM, 0))

perror(“socket creation fled”);

return 1;

}

memset(&server_address, 0, sizeof(server_address));

memset(&client_address, 0, sizeof(client_address));

// 為服務器配置地址結構

server_address.sin_family = AF_INET;

server_address.sin_addr.s_addr = INADDR_ANY;

server_address.sin_port = htons(PORT);

// 將套接字綁定到服務器地址

if (bind(tcp_socket, (const struct sockaddr *)&server_address, sizeof(server_address))

perror(“bind fled”);

return 1;

}

// 開始監(jiān)聽請求

if (listen(tcp_socket, 3)

perror(“l(fā)isten”);

return 1;

}

printf(“Wting for connections on port %d…\n”, PORT);

// 接收TCP流

new_socket = accept(tcp_socket, (struct sockaddr *)&client_address, &addr_length);

while (1) {

n = recv(new_socket, buffer, sizeof(buffer), 0);

printf(“Received from %s:%d:\n”, inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port));

printf(“%s”, buffer);

memset(&buffer, 0, sizeof(buffer));

}

close(tcp_socket);

return 0;

}

“`

該代碼在接受TCP連接之后,接收從客戶端發(fā)送過來的流,直到連接關閉。

相關問題拓展閱讀:

  • linux手冊翻譯——socket(2)

linux手冊翻譯——socket(2)

socket – 創(chuàng)建一個用于通信的端點

socket() 創(chuàng)建用于通信的端點并返回引用該端點的文件描述符。 成功調(diào)用時返回的文件描述符,將是當前沒有被進程打開的所有文件描述符中編號更低的。

domain 參數(shù)指定一個通信域; 以決定用于通信的協(xié)議族。 這些系列在 中定義。 目前 Linux 內(nèi)核理解的格式包括:

當然最常用的當然是

AF_INET

,即IPV4。

上述地址族的更多詳細信息以及其他幾個地址族的信息可以在 address_families(7) 中找到。

套接字具有指定的 type ,它指定了通信語義。 當前定義的類型有:

某些套接字類型可能不會被所有協(xié)議族實現(xiàn)。

從 Linux 2.6.27 開始,type 參數(shù)有第二個用途:除了指定套接字類型之外,它還可以包含以下任何值的按位或,以修改 socket() 的行為:

老朋友了,上述兩個,之一個是非阻塞,第二改棗個是執(zhí)行exec時自動關閉。

protocol 指定要與套接字一起使用的特定協(xié)議。

通常只存在一個協(xié)議來支持給定協(xié)議族中的特定套接字類型

,在這種情況下,protocol 可以指定為 0。但是,可能存在許多協(xié)議,在這種情況下,必須在此指定特定協(xié)議方式。 特定協(xié)議對應的編號可以查看文件: /etc/protocols

SOCK_STREAM 類型的套接字是全雙工字節(jié)流。 它們不保留記錄邊界。 流套接字必須處于連接狀態(tài),然后才能在其上發(fā)送或接收任何數(shù)據(jù)。 到另一個套接字的連接是通過 connect(2) 調(diào)用創(chuàng)建的。 連接后,可以使用 read(2) 和 write(2) 調(diào)用或 其變體send(2) 和 recv(2) 的來傳輸數(shù)據(jù)。 當會話完成時,可以執(zhí)行 close(2)。 帶外數(shù)據(jù)也可以按照 send(2) 中的描述進行傳輸,并按照 recv(2) 中的描述進行接收。

實現(xiàn) SOCK_STREAM 的通信協(xié)議確保數(shù)據(jù)不會丟失或重復。 如果協(xié)議的緩沖空間中存在一條數(shù)據(jù)在合理告肢的時間內(nèi)不能成功傳輸,則認為該連接已失效。 當 SO_KEEPALIVE 在套接字上啟用時,將會以特定于協(xié)議的方式檢查另一端是否仍然存在。 如果進程在損壞的流上發(fā)送或接收,則會引發(fā) SIGPIPE 信號; 這會導致不處理信號的進程退出。 SOCK_SEQPACKET 套接字使用與 SOCK_STREAM 套接字相同的系統(tǒng)調(diào)用。 唯一的區(qū)別是 read(2) 調(diào)用將只返回請求的數(shù)據(jù)量,到達數(shù)據(jù)包中剩余的其他數(shù)據(jù)都將被丟棄。 傳入數(shù)據(jù)報中的所有消息邊界也被保留。

SOCK_DGRAM 和 SOCK_RAW 套接字允許將數(shù)據(jù)報發(fā)送到在 sendto(2) 調(diào)用中指定的通信者。 數(shù)據(jù)報通常用 recvfrom(2) 接收,它返回下一個數(shù)據(jù)報及其發(fā)送者的地址。

SOCK_PACKET 是一種過時的套接字類型,用于直接從設備驅(qū)動程序接收原核友拆始數(shù)據(jù)包。 改用 packet(7)。

An fcntl(2) F_SETOWN operation can be used to specify a process or process group to receive a SIGURG signal when the out-of-band data arrives or SIGPIPE signal when a SOCK_STREAM connection breaks unexpectedly. This operation may also be used to set the process or process group that receives the I/O and asynchronous notification of I/O events via SIGIO. Using F_SETOWN is equivalent to an ioctl(2) call with the FIOSETOWN or SIOCSPGRP argument.

When the network signals an error condition to the protocol module (e.g., using an ICMP message for IP) the pending error flag is set for the socket. The next operation on this socket will return the error code of the pending error. For some protocols it is possible to enable a per-socket error queue to retrieve detailed information about the error; see IP_RECVERR in ip(7).

套接字的操作由套接字選項控制。 這些選項在 中定義。 函數(shù)setsockopt(2) 和getsockopt(2) 用于設置和獲取選項。對于選項的描述,詳見socket(7).

成功時,將返回新套接字的文件描述符。 出錯時,返回 -1,并設置 errno 以指示錯誤。

POSIX.1-2023, POSIX.1-2023, 4.4BSD.

The SOCK_NONBLOCK and SOCK_CLOEXEC flags are Linux-specific.

socket() appeared in 4.2BSD. It is generally portable to/from non-BSD systems supporting clones of the BSD socket layer (including System V variants).

在 4.x BSD 下用于協(xié)議族的清單常量是 PF_UNIX、PF_INET 等,而 AF_UNIX、AF_INET 等用于地址族。 但是,BSD 手冊頁已經(jīng)承諾:“協(xié)議族通常與地址族相同”,隨后的標準到處都使用 AF_*。

recvfrom函數(shù) linux的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關于recvfrom函數(shù) linux,Linux中使用recvfrom函數(shù)接收數(shù)據(jù),linux手冊翻譯——socket(2)的信息別忘了在本站進行查找喔。

成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務、應用軟件開發(fā)、網(wǎng)站建設推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎服務!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務器和獨立服務器。創(chuàng)新互聯(lián)——四川成都IDC機房服務器托管/機柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機房租用、服務器托管、機柜租賃、大帶寬租用,高電服務器托管,算力服務器租用,可選線路電信、移動、聯(lián)通機房等。


當前名稱:Linux中使用recvfrom函數(shù)接收數(shù)據(jù)(recvfrom函數(shù)linux)
文章位置:http://www.5511xx.com/article/dhdoepd.html