创建一个基本的C/C++ TCP套接字写入程序

18

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

//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中我的接口,我可以100%验证数据包正在发送出去,所以那不是问题所在。

我只对修改现有内容感兴趣,而不是使用boost asio创建完整功能的服务器。 我该如何调整它,使其在TCP方面运行?


3
SOCK_DGRAM改为SOCK_STREAM。(提示:UDP = 用户数据报协议)。 - BoBTFish
2个回答

26

以下是传输数据需要做出的更改:

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

  2. 绑定后,服务器应进入侦听模式(请查阅侦听的手册页面),客户端在创建套接字后应连接。

  3. 然后,在侦听之后,在服务器端接受请求。

  4. 最后,读取并写入以传输数据。

附带的图表将为您清晰地展示TCP连接。

TCP Socket programming

您可以查看手册页面以获得有关所有函数的详细信息,或者参考Beej的套接字编程指南(使用链接)。


9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接