非阻塞的客户端和服务器套接字用C [英] Non-blocking client and server sockets in C

查看:101
本文介绍了非阻塞的客户端和服务器套接字用C的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开始阅读和了解套接字,但我找了个小code语言编写的一个客户端和服务器,这将是不可阻挡的C-样品

的code应该能够从客户机发送的输入和服务器必须能够接收处于非阻隔状态的输出,都应该在非阻塞状态。

我已经读了很多在谷歌和书,YouTube,但没有什么帮助。

这是我的服务器:

 的#include< SYS / types.h中>
#包括LT&; SYS / socket.h中>
#包括LT&; netinet / in.h中>
#包括LT&; ARPA / inet.h>
#包括LT&;&stdio.h中GT;
#包括LT&;&unistd.h中GT;
#包括LT&;&errno.h中GT;
#包括LT&;&string.h中GT;
#包括LT&;&stdlib.h中GT;诠释的main()
{
    INT袜子;
    INT addr_len,bytes_read缓存;
    焦炭recv_data [1024];
    结构SOCKADDR_IN SERVER_ADDR,client_addr;
    如果((袜子=插座(AF_INET,SOCK_DGRAM,0))== -1){
        PERROR(插座);
        出口(1);
    }    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(5000);    server_addr.sin_addr.s_addr = inet_addr(127.0.0.1);    bzero(及(server_addr.sin_zero),8);
    如果(绑定(袜子,(结构sockaddr *)及SERVER_ADDR,
             的sizeof(结构sockaddr))== -1)
    {
        PERROR(绑定);
        出口(1);
    }    addr_len = sizeof的(结构sockaddr);    的printf(\\ nUDPServer等待客户端的5000端口);
    fflush(标准输出);    而(1)
    {        bytes_read缓存= recvfrom的(袜子,recv_data,1024,0(结构sockaddr *)及client_addr,&安培; addr_len); //< ----这是问题所在
        recv_data [bytes_read缓存] ='\\ 0';        的printf(\\ N(%S,%D)说:INET_NTOA(client_addr.sin_addr)
               还有ntohs(client_addr.sin_port));
        的printf(%S,recv_data);
        fflush(标准输出);    }
    返回0;
}


解决方案

我觉得你问如何非阻塞套接字上执行I / O。 Beej的指南已经存在了很长一段时间;它涵盖了所有这些以及更多,具有良好的code样品。

I started to read and learn about "sockets", but I'm looking for a small code-sample written in C for a client and server which will be non-blocking

The code should be able to send input from the client and the server must be able to receive the output in the non-blocking state, both should be in the non-blocking state.

I've read a lot in Google and books, YouTube, but nothing really helped.

This is my server:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    int sock;
    int addr_len, bytes_read;
    char recv_data[1024];
    struct sockaddr_in server_addr , client_addr;


    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("Socket");
        exit(1);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(5000);

    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    bzero(&(server_addr.sin_zero),8);


    if (bind(sock,(struct sockaddr *)&server_addr,
             sizeof(struct sockaddr)) == -1)
    {
        perror("Bind");
        exit(1);
    }

    addr_len = sizeof(struct sockaddr);

    printf("\nUDPServer Waiting for client on port 5000");
    fflush(stdout);

    while (1)
    {

        bytes_read = recvfrom(sock,recv_data,1024,0, (struct sockaddr *)&client_addr, &addr_len);  // <---- Here is the problem


        recv_data[bytes_read] = '\0';

        printf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr),
               ntohs(client_addr.sin_port));
        printf("%s", recv_data);
        fflush(stdout);

    }
    return 0;
}

解决方案

I think you're asking how to perform I/O on a non-blocking socket. Beej's guide has been around for a long time; it covers all this and more, with good code samples.

这篇关于非阻塞的客户端和服务器套接字用C的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆