【问题标题】:Socket programming using Windows 10 and C (Visual Studio 2015)使用 Windows 10 和 C (Visual Studio 2015) 进行套接字编程
【发布时间】:2018-11-09 11:44:21
【问题描述】:

我使用 Windows 10 和 C (visual studios 2015) 编写了套接字服务器代码,但我认为绑定或监听代码是错误的。

当我执行我的代码时,它不会等到客户端连接。打印出“winsock 初始化成功”和“创建套接字成功”后完成。

请帮帮我。


#include <stdio.h>
#include <winsock2.h>

int main(int argc, char *argv[]) {

    WSADATA wsaData;

    struct sockaddr_in address_of_server;
    struct sockaddr_in address_of_client;

    int socket_of_client;
    int size_of_address_of_client = sizeof(address_of_client);

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) == 0) {
        printf("winsock initialization success\n");
    }
    else {
        printf("winsock initialization failure\n");
    }

    SOCKET socket_of_server = socket(AF_INET, SOCK_STREAM, 0);

    if (socket_of_server == -1) {
        printf("creating socket failure\n");
    }
    else {
        printf("creating socket success\n");
    }

    memset(&address_of_server, 0, sizeof(address_of_server));
    address_of_server.sin_family = AF_INET;
    address_of_server.sin_addr.s_addr = htonl(INADDR_ANY);
    address_of_server.sin_port = htons(atoi(10000));

    bind(socket_of_server, (struct sockaddr*)&address_of_server, sizeof(address_of_server));

    listen(socket_of_server, 5);

    socket_of_client = accept(socket_of_server, (struct sockaddr*)&address_of_client, &size_of_address_of_client);

    WSACleanup();

}

【问题讨论】:

  • 我猜您的服务器示例尚未完成。 (我曾经为套接字服务器/客户端编写了包装类,从那时起几乎忘记了有关内部的所有内容。)但是,下一步将是accept() 一个连接。 MSDN 上有很多文档可能会有所帮助。首先,这是我停止回忆的链接:MSDN: Complete Winsock Server Code
  • listen 仅声明该套接字将用于传入连接并为其设置队列。 accept 调用是实际等待新连接所必需的。您应该在谷歌上搜索 socket tutorial C 以获取一些示例
  • 非常感谢你!!!我认为 listen() 实际上是在等待电话。谢谢,再次感谢!

标签: c windows sockets


【解决方案1】:

在listen() 之后你需要调用accept() 来获得一个新的连接套接字。 listen() 只是开始监听,不等待任何客户端连接。

【讨论】:

  • 非常感谢你!!!我认为 listen() 实际上是在等待电话。谢谢,再次感谢!
  • 好的我会在文中上传!
  • atoi 不应该在 htons(atoi(1000)) 中使用,因为它需要一个字符串作为输入,你可以直接做 address_of_server.sin_port = htons(10000);.
  • 除此之外,您还需要检查 bind & listen 的返回值,并使用 WSAGetLastError 检查发生的特定错误。
  • 可能你的绑定和监听没有成功,所以接受也不起作用
猜你喜欢
  • 2014-03-24
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2016-08-21
  • 2016-01-16
  • 1970-01-01
相关资源
最近更新 更多