网络编程基础(一)TCP/UDP简单使用

TCP实现两机网络通信

//服务机      server.c 
//使用方法    ./server
//功能        通过网络端口接受发送端信息

#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <strings.h>
#include <stdbool.h>
#include <pthread.h>
#include <semaphore.h>

#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/fb.h>
#include <linux/un.h>

// 网络编程
#include <arpa/inet.h>
#include <netinet/in.h>

int main(int argc, char **argv)
{
    // 创建套接字: TCP   (准备服务机)
    int fd = socket(AF_INET, SOCK_STREAM, 0);

    // struct sokaddr_in: 这个结构体用来存放服务器的 IP + PORT
    // 准备好专属结构体
    struct sockaddr_in addr;
    socklen_t len = sizeof (addr);
    bzero(&addr, len);

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("192.168.27.32");
    addr.sin_port = htons(50001);

    //将此结构体绑定到 fd 
    bind(fd, (struct sockaddr *)&addr, len);

    //设置套接字为监听状态,此时该套接字最多同时可以有(N + 4)个连接请求
    listen(fd, 3);

    //是否保存发送端的属性 IP + PORT
    //是则有以下操作
    struct sockaddr_in cliaddr;
    len = sizeof (cliaddr);
    bzero(&addr, len);

    //阻塞等待对方连接
    int connfd = accept(fd, (struct sockaddr *)&addr, &len);

    printf("新的连接,对方的属性如下! \nIP: %s\tPORT: %hu\n",
                     inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));

    //显示发送端发送来的信息
    char msg[100];
    while(1)
    {
        bzero(msg, 100);
        if (read(connfd, msg, 100) == 0)
            break;
        printf("收到客户端数据:%s", msg);
    }
    close(connfd);
}


//客户机         client.c
//使用方法       ./client x.x.x.x PORT
//功能          通过网络端口对服务机发送消息

/*假装有头文件*/
int main(int argc, char **argv)
{
    if (argc != 3)
    {
        printf("参数个数不符合标准\n");
        exit(0);
    }

    //准备好套接字:TCP 客户机随机IP + PORT
    int fd = socket(AF_INET, SOCK_STREAM, 0);

    //准备好服务机的 IP + PORT 到相应的结构体
    struct sockaddr_in addr;
    socklen_t len = sizeof (addr);
    bzero(&addr, len);

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(argv[1]);
    addr.sin_port = htons(atoi(argv[2]));

    //向服务机发起连接请求 
    connect(fd, (struct sockaddr *)&addr, len);

    //消息发送
    char msg[100];
    while(1)
    {
        bzero(&msg, 100);
        fgets(msg, 100, stdin);
        write(fd, msg, strlen(msg));
    }
    close(fd);
    return 0;
}

由于UDP 和 TPC有很多相似之处,所以就不在这里编写代码了
以下为该模块的一个总结

TCP 通信

客户机
1、创建套接字:socket()
2、将服务机属性写入结构体 struct sockaddr_in addr;
字符串转 IP : inet_addr();
字符串转 PORT: htons(atoi(char *));
3、向服务机发送连接请求 connect();
4、消息发送

服务机
1、创建套接字: socket();
2、设置唯一 IP + PORT 组合到 struct sockaddr_in 的一个结构体中
(参考客户机端的相关操作)
3、绑定该结构体到创建的套接字中 bind();
4、设置套接字为监听状态 listen();
5、如果要保留客户机属性就准备结构体
6、阻塞等待客户机连接 accpet();
7、显示接受到消息

几点注意:通用属性结构体 (struct sockaddr)

UDP 相关有空再写

猜你喜欢

转载自blog.csdn.net/qq_41985711/article/details/82377282