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

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

新聞中心

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

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

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

recvfrom函數(shù)概述

recvfrom函數(shù)允許我們從網(wǎng)絡(luò)套接字中接收數(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是操作標(biāo)志,src_addr是指向發(fā)送端套接字地址結(jié)構(gòu)的指針,addrlen是指向發(fā)送端套接字地址結(jié)構(gòu)長(zhǎng)度的指針。

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

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

下面是一些在的示例:

1. 接收UDP報(bào)文

在使用UDP協(xié)議進(jìn)行通信時(shí),我們可以使用recvfrom函數(shù)來(lái)接收UDP數(shù)據(jù)報(bào)文。下面是一個(gè)簡(jiǎn)單的示例代碼:

“`

#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));

// 為服務(wù)器配置地址結(jié)構(gòu)

server_address.sin_family = AF_INET;

server_address.sin_addr.s_addr = INADDR_ANY;

server_address.sin_port = htons(PORT);

// 將套接字綁定到服務(wù)器地址

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ù)報(bào)文

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;

}

“`

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

2. 接收TCP流

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

“`

#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));

// 為服務(wù)器配置地址結(jié)構(gòu)

server_address.sin_family = AF_INET;

server_address.sin_addr.s_addr = INADDR_ANY;

server_address.sin_port = htons(PORT);

// 將套接字綁定到服務(wù)器地址

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

perror(“bind fled”);

return 1;

}

// 開(kāi)始監(jiān)聽(tīng)請(qǐng)求

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ā)送過(guò)來(lái)的流,直到連接關(guān)閉。

相關(guān)問(wèn)題拓展閱讀:

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

linux手冊(cè)翻譯——socket(2)

socket – 創(chuàng)建一個(gè)用于通信的端點(diǎn)

socket() 創(chuàng)建用于通信的端點(diǎn)并返回引用該端點(diǎn)的文件描述符。 成功調(diào)用時(shí)返回的文件描述符,將是當(dāng)前沒(méi)有被進(jìn)程打開(kāi)的所有文件描述符中編號(hào)更低的。

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

當(dāng)然最常用的當(dāng)然是

AF_INET

,即IPV4。

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

套接字具有指定的 type ,它指定了通信語(yǔ)義。 當(dāng)前定義的類(lèi)型有:

某些套接字類(lèi)型可能不會(huì)被所有協(xié)議族實(shí)現(xiàn)。

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

老朋友了,上述兩個(gè),之一個(gè)是非阻塞,第二改棗個(gè)是執(zhí)行exec時(shí)自動(dòng)關(guān)閉。

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

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

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

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

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

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

SOCK_PACKET 是一種過(guò)時(shí)的套接字類(lèi)型,用于直接從設(shè)備驅(qū)動(dòng)程序接收原核友拆始數(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).

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

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

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 手冊(cè)頁(yè)已經(jīng)承諾:“協(xié)議族通常與地址族相同”,隨后的標(biāo)準(zhǔn)到處都使用 AF_*。

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

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


網(wǎng)頁(yè)名稱:Linux中使用recvfrom函數(shù)接收數(shù)據(jù)(recvfrom函數(shù)linux)
網(wǎng)址分享:http://m.5511xx.com/article/dhdoepd.html