客户端的socket编程

时间:2009-02-24 04:16:01

标签: c++ linux sockets

我用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;
}

9 个答案:

答案 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)

低级套接字编程繁琐且容易出错。建议您开始使用BoostACE之类的框架来保护您免受这些低级别细节的影响,并允许您编写独立于平台的程序。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

尝试添加:

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

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