开发者社区> 问答> 正文

linux socket 求助,总是提示 Connection refused

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这个函数,但是客户端直接就返回拒绝了

求解答。

展开
收起
a123456678 2016-06-13 15:27:42 5104 0
1 条回答
写回答
取消 提交回答
    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试试,怎么能不报呢??

    2019-07-17 19:36:09
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载