创建基本的C/C++ TCP套接字编写器

前端之家收集整理的这篇文章主要介绍了创建基本的C/C++ TCP套接字编写器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下是我提出的以下基本socket代码
//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而不是UDP的方式运行?

解决方法

以下是通过TCP传输数据所需的更改

>同时创建套接字传递正确的参数.在上面的例子中,你传递SOCK_DGRAM而不是传递SOCK_STREAM.
>绑定后的服务器应该进入监听模式(检查手册页面的listen)
而客户端应在套接字创建后连接.
>然后在服务器端接受后听.
>最终读取和写入传输数据

附图将给您一个清晰的TCP连接画面

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

猜你在找的C&C++相关文章