c++ - write - udp client server




기본 C/C++ TCP 소켓 작성기 작성 (2)

다음은 TCP를 통해 데이터를 전송하기 위해 필요한 변경 사항입니다.

  1. 소켓을 생성하는 동안 올바른 매개 변수를 전달합니다. 위의 예에서는 SOCK_STREAM 대신 SOCK_DGRAM을 전달했습니다.

  2. 바인딩 서버가 청취 모드로 들어간 후에 클라이언트 측이 소켓 생성 후 연결해야하는 동안 수신 페이지의 매뉴얼 페이지를 확인해야합니다.

  3. 들어 후 서버 측에서 받아들입니다.

  4. 데이터 전송을위한 최종 읽기 및 쓰기

첨부 된 다이어그램은 TCP 연결에 대한 명확한 그림을 제공합니다.

매뉴얼 페이지에서 모든 기능에 대한 자세한 정보를 확인하거나 소켓 프로그래밍을위한 beej 가이드를 참조 할 수 있습니다 ( this 링크 사용)

아래는 다음 기본 소켓 코드입니다.

//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);
}

이것은 매우 기본적이고 실제로 작동합니다. 그러나 TCP 패킷 대신 UDP 패킷을 보내므로 대상 호스트가 TCP를 예상하여이를 거부합니다. 또한 연결 / 전송 값을 검사하고 ngrep을 사용하여 인터페이스를 보면서 패킷이 나가는 지 100 % 확인할 수 있으므로 문제는 아닙니다.

나는 내가 가지고있는 것을 수정하는 것에 만 관심이 있으며, boost asio로 완전한 기능의 서버를 만들지는 않습니다. UDP 대신 TCP의 관점에서 작동하도록 어떻게 조정할 수 있습니까?






tcp