客户端中的套接字编程

Posted

技术标签:

【中文标题】客户端中的套接字编程【英文标题】:socket programming in client 【发布时间】:2009-02-24 04:16:00 【问题描述】:

我在 C++ 和 Linux 平台上编写了这个程序。

我写了一个客户端和服务器套接字程序。

在那个客户端程序中,我编写了套接字函数,之后我立即执行了一些完全不依赖于套接字的其他操作(我为其他一些逻辑编写了 2 个 for 循环)。

之后,我准备了套接字所需的结构并编写了连接函数...因为连接返回-1,所以我收到了无法连接的错误...

但是对于同一个程序,如果我将 for 循环的逻辑写在 socket 函数之上,紧接着该结构和 connect 函数之后,那么它工作正常..

我无法获得的可能原因是什么?请在这方面帮助我。这是我的代码


这里 index1 和 index 2 是简单的整数变量..configstring 是一个 char 数组,包含 127.0.0.1:7005(地址和端口号)...address 和 port 是 char 数组变量,用于存储地址和端口号..

struct sockaddr_in s1;

for(index1=0;configstring[index1]!=':';index1++)

    address[index1] = configstring[index1];

address[index1++]='\0';

for(index2=0;configstring[index1]!='\0';index1++,index2++)

    port[index2] = configstring[index1];

port[index2++]='\0';

int port_num = changeto_int(port);

if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)

    printf("unable to create a socket\n");
    return 0;


s1.sin_family=AF_INET;
s1.sin_port=htons(port_num);
s1.sin_addr.s_addr=inet_addr(address);
memset(s1.sin_zero, '\0', sizeof s1.sin_zero);
int errno;

if(connect(sock_fd,(struct sockaddr *)&s1,sizeof(s1)) == -1)

    printf("error:unable to connect\n");
    printf("Error in connect(): %s\n", strerror( errno));
    return -1;

【问题讨论】:

这个问题的问法非常令人困惑。 你试过用netcat分别测试客户端或服务器吗? 你必须获得errno* before doing anything else that could change it, such as calling printf()`。您需要在修复此问题后提供错误输出。 【参考方案1】:

首先,永远不要这样做:

int errno;

errno 已经为你定义好了。

除此之外,我建议您使用 perror() 而不是

printf("Error in connect(): %s\n", strerror( errno));

第三,你不能调用 printf 而不是 strerror(errno) 因为 printf 会改变 errno 对成功的价值。

第三,我建议看一下互联网上的例子并从它们开始。

我建议阅读man select_tut 有很多很好的编写代码示例 如何做和做什么。

【讨论】:

我使用 perror 它是“非套接字上的套接字操作”【参考方案2】:

你试过在 errno 上调用 strerror 吗? connect() 返回 -1 意味着 errno 已设置,并且应该包含有关您的错误的更多信息。

printf("Error in connect(): %s\n", strerror(errno));

【讨论】:

【参考方案3】:

您是否简单地认为您的接收器没有正确监听连接?

正如其他人所说,使用 perror 检查 errno 并将一些可用的调试信息打印到控制台。

如果没有您的示例代码,就无法为您提供帮助。可能有一百万个原因。也许您的机器上有防火墙阻止连接?也许服务器没有在监听,或者端口不正确(您确实转换为网络字节顺序,不是吗?)。可能客户端连接到错误的地址或端口。也许你没有正确设置你的结构。

我建议阅读Beej's Socket Programming Doo-Daa 以获得对 Unix 上的套接字的良好介绍(它会在 Windows 上继续使用)。

【讨论】:

【参考方案4】:

struct sockaddr_in s1;

您能否在程序开始时尝试 s1 的 memset。 我经历过一些类似的事情。

【讨论】:

【参考方案5】:

你能打印关于地址和端口字符串的调试信息吗?

删除 errno 的东西,包含并使用 perror。

使用 -Wall 编译

【讨论】:

【参考方案6】:

从您的评论来看,perror() 返回“非套接字上的套接字操作”...您的 addressport 变量是如何声明的? port[index2++]='\0' 是否有可能以某种方式覆盖到 sock_fd 上?

【讨论】:

那是在调用printf() 之后。它已经被它破坏了。我们不知道真正的错误是什么。可能 ECONNREFUSED,但在这个后期我们永远不会知道。【参考方案7】:

尝试添加:

inet_pton(AF_INET, your IP address, (void *)&server_address); 

在连接到服务器之前。 另外,我有一种预感,幕后的问题可能出在服务器端。

【讨论】:

【参考方案8】:

低级套接字编程繁琐且容易出错。建议您开始使用像 Boost 或 ACE 这样的框架,它们可以保护您免受这些低级细节的影响,并允许您独立于平台进行编程。

【讨论】:

以上是关于客户端中的套接字编程的主要内容,如果未能解决你的问题,请参考以下文章

通过 C 中的套接字编程处理多个客户端

如何使用套接字编程定义客户端服务器并将数据库传递给 C# 中的客户端

使用 C (Ubuntu) 进行套接字编程中的分段错误

语言互操作性中的套接字编程

语言互操作性中的套接字编程

C 中的 Windows 套接字编程