gpt4 book ai didi

c++ - 创建一个基本的 C/C++ TCP 套接字编写器

转载 作者:IT老高 更新时间:2023-10-28 22:17:54 25 4
gpt4 key购买 nike

以下是我想出的以下基本套接字代码:

//General includes:
#include <iostream>
#include <stdio.h>
#include <string>

//Network related includes:
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

//Target host details:
#define PORT 1234
#define HOST "74.74.74.74"

using namespace std;

//Function prototypes:
string MessageFormat(int, char**);
void MessageSend(string);

int main(int argc, char *argv[])
{
//Parse arguments and format message:
string message = MessageFormat(argc, argv);

//Send the message out:
MessageSend(message);

return 0;
}

string MessageFormat(int argc, char *argv[])
{
//Massage the command line parameters
// into my desired payload format.

return message;
}

void MessageSend(string message)
{
int sd, ret;
struct sockaddr_in server;
struct in_addr ipv4addr;
struct hostent *hp;

sd = socket(AF_INET,SOCK_DGRAM,0);
server.sin_family = AF_INET;

inet_pton(AF_INET, HOST, &ipv4addr);
hp = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET);
//hp = gethostbyname(HOST);

bcopy(hp->h_addr, &(server.sin_addr.s_addr), hp->h_length);
server.sin_port = htons(PORT);

connect(sd, (const sockaddr *)&server, sizeof(server));
send(sd, (char *)message.c_str(), strlen((char *)message.c_str()), 0);
}

这是非常基本的,并且确实有效。但是,它发送的是 UDP 数据包而不是 TCP 数据包,因此期望 TCP 的目标主机拒绝这些。此外,通过检查连接/发送值并使用 ngrep 观察我的接口(interface),我可以 100% 验证数据包是否发出,所以这不是问题。

我只对修改我拥有的东西感兴趣,而不是使用 boost asio 创建一个功能齐全的服务器。我该如何调整它以使其根据 TCP 而不是 UDP 运行?

最佳答案

以下是通过 TCP 传输数据需要进行的更改

  1. 在创建套接字时传递正确的参数。在上面的示例中,您传递的是 SOCK_DGRAM 而不是传递 SOCK_STREAM。

  2. 绑定(bind)服务器后应该进入监听模式(查看监听手册页)而客户端应该在创建套接字后连接。

  3. 监听后在服务器端接受。

  4. 最终读写传输数据

附上的图会让你清楚地了解 TCP 连接

TCP Socket programming

您可以查看手册页了解所有功能的详细信息,或引用 beej 的套接字编程指南(使用 this 链接)

关于c++ - 创建一个基本的 C/C++ TCP 套接字编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16486361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com