connect()或accept()的Client Server问题

时间:2010-04-15 08:53:02

标签: c unix tcp connection client-server

所有。我对客户端服务器程序有一些奇怪的问题。我有两种不同类型的客户端试图连接到一台服务器,一种是比另一种服务器更准确,只有更少的事情要做。但另一方面,他们几乎是一样的。虽然准系统代码可以连接到服务器,服务器接受它很好,但精心设计的版本却不能。客户端说它已连接,发送消息(通过send()和sendto())并获取返回的字节数。但服务器无法识别它。我不确定为什么,特别是在比较两个版本的客户端时,它们实际上是相同的(至少在调用connect()之前),精心制作的版本有bind()而裸机版本没有。任何人都可以看到一个问题,为什么这些非常相似的代码不起作用:P

    if (argc == 3)
{
    host = argv[1];         // server address
    info.c_name = argv[2];
}
else
{
    printf("plz read the manual, kthxbai\n");
    exit(1);
}

hp = gethostbyname(host);
if (!hp)
    exit(1);
printf("host found\n");

// setting up address and port structure information
bzero((char * ) &server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(SERVER_PORT);


// opening up socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
    exit(1);
else
    printf("socket is opened: %i \n", sockfd);
info.sock_fd = sockfd;


// binding socket to a port: not in barebone version
rv = bind(sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
if (rv < 0)
{
    printf("MAIN: ERROR bind() %s\n", strerror(errno));
    exit(1);
}
else
    printf("socket is bound\n");

// connecting
rv = connect(sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
printf("rv = %i\n", rv);
if (rv < 0)
{
    printf("MAIN: ERROR connect() %i:  %s\n", errno, strerror(errno));
    exit(1);
}
else
    printf("connected\n");

我甚至不确定问题出在哪里,是否是精心设计的客户端版本,还是只是服务器?感谢任何启发。

1 个答案:

答案 0 :(得分:1)

如果代码真的是你正在使用的,那么你的客户端(神奇地!)连接到自己,因为TCP有点模糊Simultaneous connect支持。

这里的问题是你根本没有使用gethostbyname的回报。 如果服务器端口可能在本地计算机上运行,​​也不应该绑定它。