socket send block

linux在内存吃光的情况下,别人给他发送的send会block,但是连接不断,所以说所有的send应该有超时 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TFTP是一个简单的文件传输协议,它使用UDP协议进行数据传输。在C++中,可以使用socket库来实现TFTP客户端和服务器端的开发。具体实现可以参考以下步骤: 1. 创建UDP socket 2. 构造TFTP请求报文 3. 发送TFTP请求报文到服务器 4. 接收服务器返回的TFTP数据包 . 解析TFTP数据包,获取文件内容 6. 关闭socket 以下是一个简单的TFTP客户端实现代码: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> using namespace std; #define TFTP_SERVER_IP "127.0.0.1" #define TFTP_SERVER_PORT 69 #define TFTP_OPCODE_RRQ 1 #define TFTP_OPCODE_DATA 3 #define TFTP_OPCODE_ACK 4 #define TFTP_OPCODE_ERROR 5 struct tftp_packet { uint16_t opcode; union { struct { char filename[128]; char mode[16]; } rrq; struct { uint16_t block_num; char data[512]; } data; struct { uint16_t block_num; } ack; struct { uint16_t error_code; char error_msg[128]; } error; } data; }; int main() { int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { cerr << "Failed to create socket" << endl; return -1; } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(TFTP_SERVER_PORT); server_addr.sin_addr.s_addr = inet_addr(TFTP_SERVER_IP); struct tftp_packet rrq_packet; memset(&rrq_packet, 0, sizeof(rrq_packet)); rrq_packet.opcode = htons(TFTP_OPCODE_RRQ); strcpy(rrq_packet.data.rrq.filename, "test.txt"); strcpy(rrq_packet.data.rrq.mode, "octet"); if (sendto(sockfd, &rrq_packet, sizeof(rrq_packet), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { cerr << "Failed to send RRQ packet" << endl; close(sockfd); return -1; } struct tftp_packet recv_packet; memset(&recv_packet, 0, sizeof(recv_packet)); socklen_t server_addr_len = sizeof(server_addr); while (true) { if (recvfrom(sockfd, &recv_packet, sizeof(recv_packet), 0, (struct sockaddr*)&server_addr, &server_addr_len) < 0) { cerr << "Failed to receive packet" << endl; close(sockfd); return -1; } if (ntohs(recv_packet.opcode) == TFTP_OPCODE_DATA) { uint16_t block_num = ntohs(recv_packet.data.data.block_num); cout << "Received data block " << block_num << endl; // TODO: 处理数据包中的文件内容 struct tftp_packet ack_packet; memset(&ack_packet, 0, sizeof(ack_packet)); ack_packet.opcode = htons(TFTP_OPCODE_ACK); ack_packet.data.ack.block_num = htons(block_num); if (sendto(sockfd, &ack_packet, sizeof(ack_packet), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { cerr << "Failed to send ACK packet" << endl; close(sockfd); return -1; } } else if (ntohs(recv_packet.opcode) == TFTP_OPCODE_ERROR) { uint16_t error_code = ntohs(recv_packet.data.error.error_code); char* error_msg = recv_packet.data.error.error_msg; cerr << "Received error packet: " << error_code << " " << error_msg << endl; close(sockfd); return -1; } else { cerr << "Received unexpected packet" << endl; close(sockfd); return -1; } } close(sockfd); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值