connect() 或accept() 的客户端服务器问题

标签 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");

我什至不确定问题出在哪里,是客户端的复杂版本还是服务器端?感谢您的启发。

最佳答案

如果代码确实是您正在使用的代码,则由于 TCP 有点晦涩难懂,您的客户端正在(神奇地!)连接到自身 Simultaneous connect支持。

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

关于connect() 或accept() 的客户端服务器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2643889/

相关文章:

c - 当我尝试从 C 程序调用已编译的 NASM 函数时出现 undefined reference 错误

c - 增加 C 打印屏幕的宽度?

c 中的复制实用程序(如 *NIX 中的 cp),无法复制 mp4 或 mp3 文件

c - write(2) 仍然报告成功,即使我关闭了套接字

c# - AcceptTcpClient 和 AcceptTcpClientAsync 区别

c - 确定大文件中字符串的唯一性

无需数学公式的计数过程

c - 编译代码时如何包含 -D_POSIX_C_SOURCE=200809

聊天服务器(C 网络编程)

Golang TCP 服务器 : how to write HTTP2 data