我用C ++和Linux平台编写了这个程序。
我写了一个客户端和服务器套接字程序。
在那个客户端程序中,我编写了socket函数,之后我立即做了一些其他操作,完全不依赖于socket(我为其他逻辑编写了2 for for循环)。
之后我准备了套接字所需的结构,并且我编写了connect函数...因为connect无法连接,因为connect返回-1 ..
但是对于同一个程序,如果我在套接字函数之上编写for循环逻辑并且紧接在该结构之后,并且连接函数,那么它工作正常..
可能是我无法得到的原因?请帮助我这方面。这是我的代码
这里index1和index2是简单的整数变量.configstring是一个char数组,包含127.0.0.1:7005(address和端口号)...地址和端口是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;
}
答案 0 :(得分:2)
首先,永远不要做这样的事情:
int errno;
已经为你定义了errno。
除此之外,我建议您使用perror()而不是
printf("Error in connect(): %s\n", strerror( errno));
第三,你不能调用printf而不是strerror(errno)因为printf会改变 errno对成功的价值。
第三,我想看看互联网上的例子并从它们开始。
我建议阅读man select_tut
有许多好的书面代码示例
如何做和什么。
答案 1 :(得分:1)
有一段时间你会碰到一本书,其头部,肩膀和躯干高于其他所有书籍。
如果您真的想要了解操作系统级别的网络(这是“发生”的网络),请获取 Advanced Programming in the UNIX(R) Environment 的副本。它为您提供了关于UNIX编程的“胆量”,“历史”和“方法”,其中包含大量专用于网络和IPC的内容。
答案 2 :(得分:0)
你试过在errno上调用strerror吗? connect()返回-1意味着已经设置了errno,并且应该有关于错误的更多信息。
printf("Error in connect(): %s\n", strerror(errno));
答案 3 :(得分:0)
您是否认为您的接收器没有正确地监听连接?
正如其他人所说,使用perror来检查errno并将一些可用的调试打印到控制台。
没有您的示例代码,无法帮助您。可能有一百万个理由。也许你的机器上有防火墙阻塞连接?也许服务器没有监听,或者是在一个不正确的端口上(你确实转换为网络字节顺序不是吗?)。也许客户端连接到错误的地址或端口。也许你没有正确设置你的结构。
我建议阅读Beej's Socket Programming Doo-Daa以获得关于Unix上套接字的详细介绍(以及随后的Windows)。
答案 4 :(得分:0)
struct sockaddr_in s1;
你可以在你的程序开始时尝试mem1的s1。 我经历过类似的事情。
答案 5 :(得分:0)
您可以打印有关地址和端口字符串的调试信息吗?
删除errno,包括并使用perror。
使用-Wall编译
答案 6 :(得分:0)
答案 7 :(得分:0)
根据您的评论判断perror()
返回“非套接字上的套接字操作”...您的address
和port
变量如何声明? port[index2++]='\0'
是否有可能以某种方式覆盖sock_fd
或其他?
答案 8 :(得分:0)
尝试添加:
inet_pton(AF_INET, your IP address, (void *)&server_address);
在连接服务器之前。 另外,我预感到幕后的问题可能出在服务器端。