简单的TCP/UDP网络程序

1.UDP的服务端程序:

 1. 创建socket           socket
 2. 为套接字绑定地址信息 bind
 3. 数据传输             recvfrom/sendto
 4. 关闭socket           close

代码如下:

int main()
{
    int sockfd = -1;
    //1. 创建套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sockfd < 0) {
        perror("socket");
        return -1;
    }
    //2. 为套接字绑定地址信息
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9000);
    addr.sin_addr.s_addr = inet_addr("192.168.43.153");

    socklen_t len = sizeof(struct sockaddr_in);
    int ret = bind(sockfd, (struct sockaddr*)&addr, len);
    if (ret != 0) {
        perror("bind");
        return -1;
    }
    //3. 数据传输
    while(1) {
        //1. 接收客户端数据
        struct sockaddr_in cli_addr;
        char buff[1024] = {0};
        recvfrom(sockfd, buff, 1023, 0, 
                (struct sockaddr*)&cli_addr, &len);
        printf("client[%s:%d] say: %s\n", 
                inet_ntoa(cli_addr.sin_addr),
                ntohs(cli_addr.sin_port),
                buff);
        //2. 向客户端回复数据
        char tmp[1024] = {0};
        printf("you say:");
        scanf("%s", tmp);
        len = sizeof(struct sockaddr_in);
        sendto(sockfd, tmp, strlen(tmp), 0, 
                (struct sockaddr*)&cli_addr, len);
    }
    close(sockfd);
    return 0;
}

2.UDP的客户端:

1. 创建socket
 2. 收发数据
 3. 关闭socket

代码如下:

int main()
{
    int sockfd = -1;

    //1. 创建socket
    sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sockfd < 0) {
        perror("socket");
        return -1;
    }
    struct sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(9000);
    serv_addr.sin_addr.s_addr = inet_addr("192.168.43.153");
    socklen_t len = sizeof(struct sockaddr_in);
    while(1) {
        char buff[1024] = {0};
        printf("you say:");
        scanf("%s", buff);
        sendto(sockfd, buff, strlen(buff), 0, 
                (struct sockaddr*)&serv_addr, len);
        //recvfrom
        char tmp[1024] = {0};
        recvfrom(sockfd, tmp, 1023, 0, 
                (struct sockaddr*)&serv_addr, &len);
        printf("serv say: %s\n", tmp);
    }
    close(sockfd);
    return 0;
}

TCP服务端:


1.创建socket      socket()
2.绑定地址信息  (sip+sport)     bind()
3.开始监听socket    listen  告诉操作系统,开始接受连接请求,并且处理
4.接收连接请求,获取新连接的socket
5.收发数据- recv/send
6.关闭socket       close()
 

int main(int argc, char *argv[])
{
    if (argc != 3) {
        printf("Usage: ./tcp_server ip port\n");
        return -1;
    }
    
    int listen_fd = -1;
    listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (listen_fd < 0) {
        perror("socket");
        return -1;
    }
    struct sockaddr_in lst_addr;
    lst_addr.sin_family = AF_INET;
    lst_addr.sin_port = htons(atoi(argv[2]));
    lst_addr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t len = sizeof(struct sockaddr_in);
    int ret = bind(listen_fd, (struct sockaddr*)&lst_addr, len);
    if (ret < 0) {
        perror("bind");
        return -1;
    }
    if (listen(listen_fd, 5) < 0) {
        perror("listen");
        return -1;
    }
    while(1) {
        struct sockaddr_in cli_addr;
        len = sizeof(struct sockaddr_in);
        int new_fd;
        new_fd = accept(listen_fd, (struct sockaddr*)&cli_addr, 
                &len);
        if (new_fd < 0) {
            perror("accept");
            continue;
        }
        while(1) {
   
            char buff[1024] = {0};
            ret = recv(new_fd, buff, 1023, 0);
            if (ret == 0) {
                printf("client shutdown!!\n");
                break;
            }else if (ret < 0) {
                //可以被原谅的错误叫被信号打断或数据没有准备好
                if (errno == EINTR || errno == EAGAIN) {
                    continue;
                }
                break;
            }
            printf("client say:%s\n", buff);
            char tmp[1024] = {0};
            printf("input:");
            fflush(stdout);
            scanf("%s", tmp);
            send(new_fd, tmp, strlen(tmp), 0);
        }
        close(new_fd);
    }
    close(listen_fd);
    return 0;
}

TCP客户端:

 1. 创建socket                               socket()
  2. 为socket绑定地址---客户端不推荐手动绑定  bind()
  3. 向服务器端发起连接请求                   connect()
  4. 收发数据                                 recv/send
  5. 关闭socket                               close
代码如下:

int main(int argc, char *argv[])
{
    if (argc != 3) {
        printf("Usage: ./tcp_client ip port");
        return -1;
    }
    //创建套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sockfd < 0) {
        perror("socket");
        return -1;
    }
    struct sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(argv[2]));
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t len = sizeof(struct sockaddr_in);
    //向服务器发起连接
    int ret = connect(sockfd, (struct sockaddr*)&serv_addr, len);
    if (ret < 0) {
        printf("connect");
        return -1;
    }
    while(1) {
        char buff[1024] = {0};
        printf("input:");
        fflush(stdout);
        scanf("%s", buff);
        //通过socket发送数据
        send(sockfd, buff, strlen(buff), 0);
        //接收数据
        char tmp[1024] = {0};
        ret = recv(sockfd, tmp, 1024, 0);
        if (ret == 0) {
            printf("peer shutdown !!\n");
            close(sockfd);
            return -1;
        }
        printf("server say:%s\n", tmp);
    }
    close(sockfd);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Freedom_222/article/details/81676807
今日推荐