TCP - C ++ - 没有用于调用的匹配函数

时间:2018-01-10 20:43:51

标签: c++ sockets tcp

我正在尝试制作一个通过TCP传输数据的基本程序。

这是客户端文件:

标题

#include <stdio.h>
#include <iostream>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <unistd.h>
#include <string>
#include <arpa/inet.h>

代码

#include "socketclient.hpp"
#include <arpa/inet.h>

socketclient::socketclient () {
    iSocket = socket(AF_INET, SOCK_STREAM, 0);

    memset(&saiAddress, '0', sizeof(saiAddress));

    saiAddress.sin_family = AF_INET;
    saiAddress.sin_port = htons(3000);
    saiAddress.sin_addr.s_addr = INADDR_ANY;

    inet_pton(AF_INET, INADDR_ANY, &saiServerAddress.sin_addr);

    connect(iSocket, (struct saiAddress *)&saiServerAddress, sizeof(saiServerAddress));

    send(iSocket, sVal, strlen(sVal.c_str()), 0);
}

但是,出于某种原因,编译器对No matching functioninet_ptonconnectsend

1 个答案:

答案 0 :(得分:4)

  

inet_pton(AF_INET,INADDR_ANY,&amp; saiServerAddress.sin_addr);

您无法将INADDR_ANY传递给inet_pton()。它期待一个char*字符串,例如:

inet_pton(AF_INET, "an IP address here", &saiServerAddress.sin_addr);

顺便说一句,无论如何,你不能connect()一个TCP套接字到INADDR_ANY(0.0.0.0)。您需要指定侦听服务器的实际IP地址。

  

connect(iSocket,(struct saiAddress *)&amp; saiServerAddress,sizeof(saiServerAddress));

您无法将saiAddress*传递给connect(),而是期待sockaddr*,例如:

connect(iSocket, (struct sockaddr *)&saiServerAddress, sizeof(saiServerAddress));

确保saiServerAddress被声明为sockaddr_insockaddr_storage(或者至少确保saiAddress与它们二进制兼容)。

  

发送(iSocket,sVal,strlen(sVal.c_str()),0);

您无法将std::string传递给send()。它需要void*代替(您不应该使用strlen(sVal.c_str()),而是使用sVal.size()),例如:

send(iSocket, sVal.c_str(), sVal.size(), 0);