Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使异步套接字服务器和客户端工作(用C编写)_C++_C_Sockets_Asynchronous_Nonblocking - Fatal编程技术网

C++ 使异步套接字服务器和客户端工作(用C编写)

C++ 使异步套接字服务器和客户端工作(用C编写),c++,c,sockets,asynchronous,nonblocking,C++,C,Sockets,Asynchronous,Nonblocking,有人能帮我查一下这些密码吗?我试图使客户机和服务器进行异步通信。我的意思是,客户机和服务器都不等待对方(例如,当服务器或客户机从recvfrom()读取数据,但数据不存在时,将使用最后接收到的数据(我称之为备份)。以下是代码: 客户 ... /* Create a datagram/UDP socket */ if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) DieWithErro

有人能帮我查一下这些密码吗?我试图使客户机和服务器进行异步通信。我的意思是,客户机和服务器都不等待对方(例如,当服务器或客户机从recvfrom()读取数据,但数据不存在时,将使用最后接收到的数据(我称之为备份)。以下是代码:

客户

    ...

    /* Create a datagram/UDP socket */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        DieWithError("socket() failed");

    /* Construct the server address structure */
    memset(&echoServAddr, 0, sizeof(echoServAddr));    /* Zero out structure */
    echoServAddr.sin_family = AF_INET;                 /* Internet addr family */
    echoServAddr.sin_addr.s_addr = inet_addr(servIP);  /* Server IP address */
    echoServAddr.sin_port   = htons(echoServPort);     /* Server port */

    /* Set signal handler for SIGIO */
    handler.sa_handler = SIGIOHandler;
    /* Create mask that mask all signals */
    if (sigfillset(&handler.sa_mask) < 0) 
        DieWithError("sigfillset() failed");
    /* No flags */
    handler.sa_flags = 0;

    if (sigaction(SIGIO, &handler, 0) < 0)
        DieWithError("sigaction() failed for SIGIO");

    /* We must own the socket to receive the SIGIO message */
    if (fcntl(sock, F_SETOWN, getpid()) < 0)
        DieWithError("Unable to set process owner to us");

    /* Arrange for nonblocking I/O and SIGIO delivery */
    if (fcntl(sock, F_SETFL, O_NONBLOCK | FASYNC) < 0)
        DieWithError("Unable to put server sock into non-blocking");
...
。。。
/*创建数据报/UDP套接字*/
如果((sock=socket(PF_INET,sock_DGRAM,IPPROTO_UDP))<0)
DIEWERROR(“套接字()失败”);
/*构造服务器地址结构*/
memset(&echoServAddr,0,sizeof(echoServAddr));/*零输出结构*/
echoServAddr.sin_family=AF_INET;/*互联网地址家族*/
echoServAddr.sin_addr.s_addr=inet_addr(servIP);/*服务器IP地址*/
echoServAddr.sin_port=htons(echoServPort);/*服务器端口*/
/*为SIGIO设置信号处理程序*/
handler.sa_handler=SIGIOHandler;
/*创建屏蔽所有信号的屏蔽*/
if(sigfillset(&handler.sa_mask)<0)
DIEWERROR(“sigfillset()失败”);
/*没有旗帜*/
handler.sa_标志=0;
if(sigaction(SIGIO,&handler,0)<0)
DIEWERROR(“SIGIO的sigaction()失败”);
/*我们必须拥有套接字才能接收SIGIO消息*/
如果(fcntl(sock、F_SETOWN、getpid())<0)
DIEWERROR(“无法将流程所有者设置为我们”);
/*安排非阻塞I/O和SIGIO交付*/
如果(fcntl(sock、F_SETFL、O_NONBLOCK | FASYNC)<0)
DIEWERROR(“无法将服务器套接字置于非阻塞状态”);
...
服务器

/*创建用于发送/接收数据报的套接字*/
如果((sock=socket(PF_INET,sock_DGRAM,IPPROTO_UDP))<0)
DIEWERROR(“套接字()失败”);
/*设置服务器地址结构*/
memset(&echoServAddr,0,sizeof(echoServAddr));/*零输出结构*/
echoServAddr.sin_family=AF_INET;/*互联网家庭*/
echoServAddr.sin_addr.s_addr=htonl(INADDR_ANY);/*任何传入干扰*/
echoServAddr.sin_port=htons(echoServPort);/*端口*/
/*绑定到本地地址*/
if(bind(sock,(struct sockaddr*)&echoServAddr,sizeof(echoServAddr))<0
DIEWERROR(“绑定()失败”);
/*为SIGIO设置信号处理程序*/
handler.sa_handler=SIGIOHandler;
/*创建屏蔽所有信号的屏蔽*/
if(sigfillset(&handler.sa_mask)<0)
DIEWERROR(“sigfillset()失败”);
/*没有旗帜*/
handler.sa_标志=0;
if(sigaction(SIGIO,&handler,0)<0)
DIEWERROR(“SIGIO的sigaction()失败”);
如果(fcntl(sock、F_SETOWN、getpid())<0)
DIEWERROR(“无法将流程所有者设置为我们”);
/*安排非阻塞I/O和SIGIO交付*/
如果(fcntl(sock、F_SETFL、O_NONBLOCK | FASYNC)<0)
DIEWERROR(“无法将客户端sock放入非阻塞状态”);
...
代码被编译并链接到任何问题上,但它们彼此不交换数据,为什么?…哪里有问题吗

谢谢你的回复


PS:代码现在已删除…

检查您的端口,我认为它们的最大值应为65535,这是端口号(16位)的最大值

给它一个较小的数字,你应该是好的

编辑:使用的最大端口数为65536,这是一个最大16位,因为它是一个短整数。如果超过最大值,它将失败。为客户端和服务器提供一个大于1024且小于65536的任意端口号

请看一下to套接字编程

希望这有帮助, 顺致敬意,
Tom。

检查您的端口,我认为它们的最大值应该是65535,这是端口号(16位)的最大值

给它一个较小的数字,你应该是好的

编辑:使用的最大端口数为65536,这是一个最大16位,因为它是一个短整数。如果超过最大值,它将失败。为客户端和服务器提供一个大于1024且小于65536的任意端口号

请看一下to套接字编程

希望这有帮助, 顺致敬意,
Tom。

在您的recv过程中,您可以使用MSG|PEEK | MSG|DONTWAIT作为recv的选项,这将允许您只检查是否有任何需要读取的数据。

在您的recv过程中,您可以使用MSG|PEEK | MSG|DONTWAIT作为recv的选项,这将允许您只检查是否有任何需要读取的数据。

谢谢您的回复!都可以使用相同的端口。你的意思是我应该多给一个吗?@mk:不!两个端口应该是相同的,但它们超过了最大端口号,最大16位是65536,给它一个较低的端口,比如说…客户端和服务器都是12345…@tommieb75:非常感谢你的评论,因为我没有注意到端口高于限制。a当我在Solaris上工作时,我认为端口取决于操作系统,它是32或64位的…感谢gain,今天收到您的评论真是太好了…我将端口更改为2023,但问题仍然存在。客户端和服务器不交换数据,尽管它们彼此连接…@mk-他们连接是什么意思?UDP是无连接的protocol?谢谢回复!两个端口都使用同一个端口。你是说我应该再给一个高一点的吗?@mk:不!两个端口应该是一样的,但它们已经超过了最大端口号,最大16位是65536,给它一个低一点的端口,比如说…客户端和服务器都使用12345…@tommieb75:非常感谢你的评论,因为我没有注意到端口高于限制。当我在Solaris上工作时,我认为端口取决于操作系统,它是32或64位的…感谢gain,今天收到您的评论真是太好了…我将端口更改为2023,但问题仍然存在。客户端和服务器不交换数据,尽管它们彼此连接…@mk-这是什么意思nnect?UDP
    /* Create socket for sending/receiving datagrams */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        DieWithError("socket() failed");

    /* Set up the server address structure */
    memset(&echoServAddr, 0, sizeof(echoServAddr));   /* Zero out structure */
    echoServAddr.sin_family = AF_INET;                /* Internet family */
    echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interf*/
    echoServAddr.sin_port = htons(echoServPort);      /* Port */

    /* Bind to the local address */
    if (bind(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
        DieWithError("bind() failed");

    /* Set signal handler for SIGIO */
    handler.sa_handler = SIGIOHandler;
    /* Create mask that mask all signals */
    if (sigfillset(&handler.sa_mask) < 0) 
        DieWithError("sigfillset() failed");
    /* No flags */
    handler.sa_flags = 0;

    if (sigaction(SIGIO, &handler, 0) < 0)
        DieWithError("sigaction() failed for SIGIO");

    if (fcntl(sock, F_SETOWN, getpid()) < 0)
        DieWithError("Unable to set process owner to us");

    /* Arrange for nonblocking I/O and SIGIO delivery */
    if (fcntl(sock, F_SETFL, O_NONBLOCK | FASYNC) < 0)
        DieWithError("Unable to put client sock into non-blocking");
 ...