C客户端套接字不输出/连接到tcp服务器

史诗雨

为什么这个头文件进入冻结状态或者即使服务器接受来自其他脚本/工具的连接也不输出任何内容

tcpclient.h

#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#pragma once

int socket_desc;
struct sockaddr_in server_addr;

int init_client()
{
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);  

    if (socket_desc < 0 )
    {
        printf("Failed to create socket\n");
        return -1;
    }
    return 0;
}

int connection(char *host,int port )
{

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr = inet_addr(host);

    if (connect(socket_desc, (struct sockaddr*)&server_addr, sizeof(server_addr))<0)
    {
        printf("Failed to connect @ %s:%d\n",host,port);
        return -1;
    }
    printf("Connected to [%s:%d]\n",host,port);
    return 0;
}

main.c像这样使用

int main()
{
    int soc = init_client();
    int con = connection("192.168.0.12",6666);
    return 0;
}

我得到的唯一警告soc是未使用该变量

路易斯科罗拉多

你的程序在我的电脑上运行正常......目前尚不清楚你声称什么。

无论如何,在稍微调整一下之后,我有几点要评论它。我将 ip 地址更改为 127.0.0.1 并将端口更改为 80 并在本地启动了一个 apache 服务器以检查服务器是否确实准备好接受连接。

首先,我检查了使用telnet(1)命令在本地打开的连接(您可能必须将其安装在您的机器中,因为默认情况下现在没有安装)

$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^]
telnet> close
Connection closed.
$ _

然后我在您的代码中更改了几处(它们应该不会影响运行,但是如果您不走这条路,它们将来会给您带来麻烦)

  • 我首先创建了一个socket.h文件来放置这两个函数的原型,因此如果您以后更改原型,您就不会遇到麻烦。

套接字.h

#ifndef _SOCKET_H
#define _SOCKET_H

int init_client(void);
int connection(const char *host, int port);

#endif /* _SOCKET_H */
As you see, I changed the parameter `host` into a `const char *` type, so the compiler knows that the string is not changed inside the function and can optimize calls, based on that.
  • 其次,我#include在两个模块中都有文件,因此如果您更改接口,两个模块(提供者和消费者)都知道接口更改。

套接字.c

#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>

我使用了最后两个包含使用strerror(errno),这给了你连接错误的原因(主要是连接被拒绝错误)


#include "socket.h"

int socket_desc = -1;
struct sockaddr_in server_addr;

这不是一个好习惯。更好的解决方案是返回套接字并将其作为参数传递给下面的连接调用。如果你想在不同的线程中使用这些函数,使用全局变量会在以后给你带来麻烦,因为 socket_desc 全局变量对你将拥有的所有线程都是通用的。


int init_client(void)
{
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);

    if (socket_desc < 0 )
    {
        printf("Failed to create socket, %s\n",
            strerror(errno));
        return -1;
    }
    return 0;
}

int connection(const char *host, int port)
{

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr = inet_addr(host);

    printf("trying connect to %s:%d\n", host, port);

    if (connect(socket_desc, (struct sockaddr*) &server_addr, sizeof(server_addr))<0)
    {
        printf("Failed to connect @ %s:%d, %s\n",
                host, port, strerror(errno));
        return -1;

在这里打印非连接的原因是了解发生了什么的好主意。

    }
    printf("Connected to [%s:%d]\n",host,port);
    return 0;
}

更好的解决方案如下:

套接字.c

#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>

#include "socket.h"

int init_client(void)
{
    int socket_desc = socket(AF_INET, SOCK_STREAM, 0);

    if (socket_desc < 0 )
    {
        printf("Failed to create socket: %s\n",
            strerror(errno));
    }
    return socket_desc;
}

int connection(int sd, const char *host, int port)
{

    struct sockaddr_in server_addr;

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr = inet_addr(host);

    printf("trying connect to %s:%d\n", host, port);

    if (connect(sd, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0) {
        printf("Failed to connect @ %s:%d, %s\n",
                host, port, strerror(errno));
        return -1;
    }
    printf("Connected to [%s:%d]\n", host, port);
    return 0;
}

socket.h变成

套接字.h

#ifndef _SOCKET_H
#define _SOCKET_H

int init_client(void);
int connection(int socket_descriptor, const char *host, int port);

#endif /* _SOCKET_H */

这种修改,使得调用程序localhost:80导致:

$ a.out
trying connect to 127.0.0.1:80
Connected to [127.0.0.1:80]
$ _

而使用 79 作为端口导致:

$ a.out
trying connect to 127.0.0.1:79
Failed to connect @ 127.0.0.1:79, Connection refused
Failed connection(), Connection refused
$ _

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C#TCP套接字服务器客户端连接

客户端断开连接后,C 套接字 TCP 服务器出现故障

Java TCP 客户端/服务器套接字

PHP客户端套接字与C#套接字服务器的连接

连接到服务器时客户端套接字超时

使用标准Web套接字客户端连接到Socket.io服务器

将Android客户端连接到NodeJS中的套接字服务器时出错

服务器/客户端套接字连接

TCP套接字服务器/客户端连接应使用哪个IP /端口?

TCP套接字服务器客户端连接fd会导致内存泄漏吗?

C#Xamarin UWP / Android服务器-客户端套接字TCP无法正确连接

如何使用url将python套接字客户端连接到服务器套接字?

客户端套接字无法连接到服务器套接字,[Errno 32] 管道损坏错误

TCP套接字从多个顺序客户端转发到与服务器的单个持久套接字连接

在C ++中使用TCP套接字进行远程客户端和服务器通信

C ++套接字服务器不接受任何客户端/客户端将无法连接

C服务器套接字拒绝python客户端的连接

客户端未与服务器C连接(套接字编程)

在C中运行客户端和服务器套接字连接-带线程

C ++套接字客户端到python服务器未创建连接

Python 2.7.8:套接字-TCP套接字中的客户端服务器数据丢失

TCP套接字,发送文件,客户端服务器,服务器不保存整个文件,C语言

React客户端套接字未与服务器套接字连接

如何使服务器套接字广播到那里,并让客户端套接字检测并连接

将客户端套接字与服务器套接字连接时出现问题

从客户端C#连接到多个TCP服务器

Spring Integration TCP客户端上的多个套接字连接到一个服务器地址

如何将一个客户端连接到多个服务器套接字?

iOS客户端使用套接字机制连接到服务器会导致“遇到流结束”