linux socket 求助,总是提示 Connection refused-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

linux socket 求助,总是提示 Connection refused

2016-06-13 15:27:42 4497 1

linux系统

服务器端:

#define PROT  8888
#define BACKLOG  5
 
 
 
int main(int argc, char const *argv[])
{
    int server_socket;
    int client_socket;
 
    struct sockaddr_in server_addr; // 服务器地址结构
 
    // 这个地址用来保存来自客户端的连接,用在accept函数中
    struct sockaddr_in client_addr; // 客户端地址结构
 
    int  err; 
    pid_t  pid;
 
    // 建立一个af_inet 域的流式套接字
    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket < 0)
    {
        std::cout << "create socket error " << std::endl;
        return -1;
    }
 
    // 设置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    server_addr.sin_port = htons(PROT);
 
    // 讲上述设置好的网络地址与套接字进行绑定
    err = bind(server_socket, (sockaddr*)&server_addr, sizeof(server_addr));
    if (err < 0)
    {
        std::cout << "bind server socket err [" << errno << "]: "<< strerror(errno) << std::endl;
        return -1;
    }
 
    // 设置侦听队列,开始接收客户端的连接
     
    std::cout << "start accept client request ..." << std::endl;
    for(; ;)
    {
        int  addrlen = sizeof(struct sockaddr_in);
 
        // 如果没有客户端连接,就会阻塞在这里。
        client_socket = accept(server_socket, (sockaddr*)&client_addr, &addrlen);
客户端:

#define PROT 8888
#define SERVER_IP "127.0.0.1"
 
int main(int argc, char const *argv[])
{
     
    int s;
    struct sockaddr_in server_addr;
    int err;
 
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s < 0)
    {
        std::cout << "socket err:" << err << std::endl;
        return -1;
    }
 
    // 设置要连接服务器的地址
    memset(&server_addr, 0, sizeof(server_addr));
 
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PROT);
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); //将网络地址字符串转化为二进制地址
 
 
    // 连接服务器
    // 将该套接字连接到 server_addr 指定的网络地址,一般是服务器地址。
    std::cout << "start connect " << std::endl;
    err = connect(s, (sockaddr*)&server_addr, sizeof(sockaddr));
     
    if (-1 == err)
    {
        std::cout << "connect error[" << errno << "]:" << strerror(errno) << std::endl;
        return -1;
    }
错误信息:

每次运行server端,能运行起来。

截图:

此时启动客户端,就会提示如下:

服务器端还阻塞在accept这个函数,但是客户端直接就返回拒绝了

求解答。

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:36:09
    1. 首先那个要加上listen,listen会把socket创建的套接字从CLOSE状态,转换到LISTEN状态
    2. err = bind(server_socket, (sockaddr)&server_addr, sizeof(server_addr));这里强制转换为什么可以直接用sockaddr 呢,不应该是struct sockaddr *呢?
    3. server_addr.sin_addr.s_addr = inet_addr(SERVER_IP)这里最好还是用inet_pton吧

    4.

    err = connect(s,(sockaddr*)&server_addr, sizeof(sockaddr));这句你仔细看看,最后一个sizeof里面的东西。改改差不多了应该,怎么能编译不报错呢,编译的时候加上-Wall试试,怎么能不报呢??

    0 0
相关问答

1

回答

c++ socket linux

2016-06-03 09:55:34 2101浏览量 回答数 1

1

回答

Linux vim 编辑模式的命令有哪些什么?

2021-12-03 19:08:35 173浏览量 回答数 1

1

回答

Linux vim 命令中 1,$/word1/word2/gc 的作用是什么?

2021-12-03 19:03:59 140浏览量 回答数 1

1

回答

Linux vim 命令中 n1,n2s/word1/word2/g 的作用是什么?

2021-12-03 19:01:48 357浏览量 回答数 1

1

回答

Linux vim 文件格式命令中 set ff=dos 的作用是什么?

2021-12-03 18:59:15 509浏览量 回答数 1

1

回答

Linux vim 编码方式命令中 tenc(termencoding) 的作用是什么?

2021-12-03 18:57:59 372浏览量 回答数 1

1

回答

Linux vim 编码方式命令中 fencs(fileencodings) 的作用是什么?

2021-12-03 18:56:52 397浏览量 回答数 1

1

回答

Linux vim 编码方式命令中 enc(encoding) 的作用是什么?

2021-12-03 18:55:49 457浏览量 回答数 1

1

回答

Linux vim命令中 <object> 的作用是什么?

2021-12-03 18:53:53 349浏览量 回答数 1

1

回答

Linux vim命令中 <action> 的作用是什么?

2021-12-03 18:52:39 351浏览量 回答数 1
+关注
文章
问答
问答排行榜
最热
最新
相关电子书
更多
ECS系统指南之Linux系统诊断
立即下载
Decian GNU/Linux安全合规之路
立即下载
ECS运维指南 之 Linux系统诊断
立即下载