【问题标题】:C TCP Client sockaddr_in pointerC TCP 客户端 sockaddr_in 指针
【发布时间】:2017-08-24 05:21:16
【问题描述】:

我想用 sockaddr_in 指针创建一个简单的 TCP 客户端。

#include <iostream>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netdb.h>
#include <stdlib.h>
#include <unistd.h>

#include <arpa/inet.h>
#include <netinet/in.h>
#include <cstdlib>

#include <errno.h>  /* errno */
#include <string.h> /* strerror() */

using namespace std;

int creeSock();
struct sockaddr_in* configConnect(int dSock, char* adresseIP, int numPort);

int main(int argc, char *argv[])
{
    if (argc < 3){
        exit(1);
    } 

    int dSock = creeSock();
    struct sockaddr_in* aD = configConnect(dSock, argv[1], atoi(argv[2]));

    close(dSock);
    return 0;
}


int creeSock(){
    int dSock;
    if( (dSock = socket(PF_INET, SOCK_STREAM, 0)) == -1){
        perror("Erreur lors de la création de la socket ");
        exit(errno);
    }

    return dSock;
}

struct sockaddr_in* configConnect(int dSock, char* adresseIP, int numPort){
    struct sockaddr_in* ad = (struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));

    if(inet_pton(AF_INET, adresseIP, &(ad->sin_addr)) <= 0){
        perror("config error");
        exit(errno);
    }

    ad->sin_port = htons(numPort);

    if (connect(dSock,(struct sockaddr*)ad, sizeof(*ad)) == -1){
        cout<<errno;
        perror("Error connect ");
        exit(errno);
    }


    return ad;
}

没有编译错误(g++ -std=c++11 client.cpp) 执行时:./a.out 127.0.0.1 42000

Error connect : Invalid argument

当 sockaddr_in 不是指针时,我的旧代码在同一台服务器上工作

提前谢谢你。

【问题讨论】:

  • 您能否显示IPPORT 的声明或定义?因为现在你所说的类型对你使用的代码没有意义。更好的是,请尝试创建一个Minimal, Complete, and Verifiable Example 并展示给我们。
  • 我使用了一个函数struct sockaddr_in* configConnect(int dSock, char* adresseIP, int numPort),我只是简化,没有函数。我的功能是像 struct sockaddr_in* aD = configConnect(dSock, argv[1], atoi(argv[2])); 那样调用 argv[1] IP 和 argv[2] PORT
  • @FlorianNovellon 与您的问题相矛盾!最好用minimal reproducible example 更新它,这样我们都在同一页面上,可以回答您的问题

标签: c++ c tcp client client-server


【解决方案1】:

您没有设置结构的 sin_family 元素。

if(inet_pton(AF_INET, IP, &(ad->sin_addr)) <= 0){
        perror("Error config ");
        exit(errno);
}

ad->sin_port = htons(PORT);

// need to set sin_family, too
ad->sin_family = AF_INET;

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多