我正在尝试制作一个通过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 function
,inet_pton
和connect
说send
。
答案 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_in
或sockaddr_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);