为什么这个头文件进入冻结状态或者即使服务器接受来自其他脚本/工具的连接也不输出任何内容
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
文件来放置这两个函数的原型,因此如果您以后更改原型,您就不会遇到麻烦。#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
在两个模块中都有文件,因此如果您更改接口,两个模块(提供者和消费者)都知道接口更改。#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;
}
更好的解决方案如下:
#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
变成:
#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] 删除。
我来说两句