【问题标题】:Linux TCP connection refusedLinux TCP 连接被拒绝
【发布时间】:2024-01-17 00:09:01
【问题描述】:

我正在做一个 TCP 连接程序,我想将地址和连接步骤设置为一个函数。该程序可以编译,但是当我运行它时,屏幕显示:错误连接:连接被拒绝。请你帮助我好吗?这是服务器代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

void error(char *msg)
{
    perror(msg);
    exit (1);
}
struct sockaddr_in createSockAddr(int portnum)
{
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(portnum);
    return addr;
}

int createServerSocket(struct sockaddr_in serv_addr)
{   
    int newsockfd;
    int sockfd;
    int clilen;
    sockfd =  socket(AF_INET, SOCK_STREAM, 0);//create socket

    if (sockfd < 0) 
        error("ERROR opening socket");


    //bind socket
    if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR on binding");  
    listen(sockfd,5);//listen
    clilen = sizeof(serv_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &serv_addr, &clilen);//accept
    if (newsockfd < 0) 
        error("ERROR on accept");

    return newsockfd;
}
int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portnum, clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int n;
    if (argc < 2) {
        fprintf(stderr,"ERROR, no port provided\n");
    exit (2);
    }
    portnum = atoi(argv[1]);
    serv_addr = createSockAddr(portnum);
    newsockfd = createServerSocket(serv_addr);

    bzero(buffer,256);
    n = read(newsockfd,buffer,255);
    if (n < 0) error("ERROR reading from socket");
    printf("Here is the message: %s\n",buffer);
    n = write(newsockfd,"I got your message",18);
    if (n < 0) error("ERROR writing to socket");
    return 0; 
}

这是客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 


void error(char *msg)
{
    perror(msg);
    exit(1);
}
struct sockaddr_in createSockAddr(int portnum)
{

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(portnum);
    return addr;
}

int createClientSocket(struct sockaddr_in sockAddr)
{

    int sockfd;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
        error("ERROR opening socket");//create socket

    if (connect(sockfd,(struct sockaddr *)&sockAddr,sizeof(sockAddr)) < 0) 
        error("ERROR connecting");
    return sockfd;
}


int main(int argc, char *argv[])
{
    int sockfd, portnum, n;

    struct sockaddr_in serv_addr;
    struct hostent *server;

    char buffer[256];
    if (argc < 3) {
        fprintf(stderr,"usage %s hostname port\n", argv[0]);
        exit(2);
    }
    portnum = atoi(argv[2]);
    serv_addr = createSockAddr(portnum);
    sockfd = createClientSocket(serv_addr);
    printf("Please enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
        error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);

    if (n < 0) 
        error("ERROR reading from socket");
    printf("%s\n",buffer);
    return 0;
}

【问题讨论】:

  • 我在该代码中看不到可以组装该错误消息的任何地方。客户端问题“连接错误”而不是“错误连接:”时连接失败,失败时不检查 errno。
  • 您是否已将 iptables 在本地运行配置为丢弃未指定端口上的任何入站连接?
  • 不~让我看看iptables是什么。我不知道。

标签: c linux tcp


【解决方案1】:

我看到的唯一值得怀疑的是,您没有在分配字段之前将 sockaddr_in 结构归零。否则,它看起来很好。在 C 中传递结构(而不​​是指向这些结构的指针)有点不典型,但我看不出它有任何不起作用的原因。 (“归零”是指memset(&amp;addr, 0, sizeof(addr)))。)

【讨论】:

  • 我试过了,但还是不行。无论如何,谢谢!
【解决方案2】:

代码可以编译(带有一些小警告),但对我有用(客户端忽略第一个参数并期望端口位于第二个)。

请再试一次,您还可以在strace 的监督下运行服务器和客户端,这是查看应用程序执行的内核系统调用的好工具。

【讨论】:

  • 好的,我会试试的。谢谢~