客户端中的套接字编程
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()
返回“非套接字上的套接字操作”...您的 address
和 port
变量是如何声明的? port[index2++]='\0'
是否有可能以某种方式覆盖到 sock_fd
上?
【讨论】:
那是在调用printf()
之后。它已经被它破坏了。我们不知道真正的错误是什么。可能 ECONNREFUSED,但在这个后期我们永远不会知道。【参考方案7】:
尝试添加:
inet_pton(AF_INET, your IP address, (void *)&server_address);
在连接到服务器之前。 另外,我有一种预感,幕后的问题可能出在服务器端。
【讨论】:
【参考方案8】:低级套接字编程繁琐且容易出错。建议您开始使用像 Boost 或 ACE 这样的框架,它们可以保护您免受这些低级细节的影响,并允许您独立于平台进行编程。
【讨论】:
以上是关于客户端中的套接字编程的主要内容,如果未能解决你的问题,请参考以下文章