网络编程(4.7作业)(TCP/UDP源代码)

文章目录

  • TCP
    • 服务器端
    • 客户端
  • UDP
    • 服务器端
    • 客户端

TCP

服务器端

// C语言专用模板
#include 
#include 
#include 
#include 
#include 
#include  /* superset of previous */
#include   /* See NOTES */
#include 
#include 
#include 

#define IP "192.168.8.225" // 设置服务器IP地址
#define PORT 1024           // 设置服务器端口号为1024

int main()
{
    /*创建字节套,以tcp方式 ipv4*/
    // int socket(int domain, int type, int protocol);
    int serve_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (serve_fd < 0)
    {
        perror("socket");
        return -1;
    }
    /*允许端口快速重用成功*/
    int resue = 1;
    if (setsockopt(serve_fd, SOL_SOCKET, SO_REUSEADDR, &resue, sizeof(resue)) < 0)
    {
        perror("setsockopt");
        return -1;
    }
    /*填充地址信息结构体*/
    struct sockaddr_in server_in;
    server_in.sin_family = AF_INET;            // 必须填AF_INET
    server_in.sin_port = htons(PORT);          // 端口号,主机转网络
    server_in.sin_addr.s_addr = inet_addr(IP); // 服务器IP,
    /*将IP和端口绑定到套接字上*/
    // int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    if (bind(serve_fd, (struct sockaddr *)&server_in, sizeof(server_in)) < 0)
    {
        perror("bind");
        return -1;
    }
    /*将套接字设置为被动监听模式*/
    // int listen(int sockfd, int backlog);
    if (listen(serve_fd, 128) < 0) // 第二个参数为队列大小,一般设置为大于1
    {
        perror("listen");
        return -1;
    }
    printf("listen success __%d__\n", __LINE__);
    /*获取连接成功的套接字,此套接字用于客户端*/
    struct sockaddr_in client_fd;           // 存储连接成功的客户端地址信息
    socklen_t addrlent = sizeof(client_fd); // 客户端字节大小

    // int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

    int serve_fd_new = accept(serve_fd, (struct sockaddr *)&client_fd, &addrlent); // 新的服务器端,用于服务客户端
    if (serve_fd_new < 0)
    {
        perror("accept");
        return -1;
    }
    printf("[%s:%d] newfd=%d 连接成功:__%d__\n", inet_ntoa(client_fd.sin_addr),
           ntohs(client_fd.sin_port), serve_fd_new, __LINE__);

    char buf[128] = ""; // 用于存储信息
    ssize_t res = 0;    // 接收(recv)的返回值
    while (1)
    {
        /*接受消息*/
        // ssize_t recv(int sockfd, void *buf, size_t len, int flags);
        bzero(buf, sizeof(buf));                       // 清空buf
        res = recv(serve_fd_new, buf, sizeof(buf), 0); // 以阻塞方式接收消息
        if (res < 0)
        {
            perror("recv");
            return -1;
        }
        else if (0 == res)
        {
            printf("[%s:%d] newfd=%d 客户端下线:__%d__\n", inet_ntoa(client_fd.sin_addr),
                   ntohs(client_fd.sin_port), serve_fd_new, __LINE__);
            break;
        }
        printf("newfd=%d: %s\n", serve_fd_new, buf);
        /*发送消息*/
        // ssize_t send(int sockfd, const void *buf, size_t len, int flags);
        printf("请输入要发送的消息>>>");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf) - 1] = 0;
        if (send(serve_fd_new, buf, sizeof(buf), 0) < 0)
        {
            perror("send");
            return -1;
        }
        printf("发送成功\n");
    }

    close(serve_fd);
    close(serve_fd_new);
    return 0;
}

客户端

// 客户端
#include 
#include 
#include 
#include 
#include 
#include  /* superset of previous */
#include   /* See NOTES */
#include 
#include 
#include 

#define IP "192.168.8.225" // 设置本机IP地址
#define PORT 1024           // 设置本机端口号为1024

int main()
{
    /*创建字节套,以tcp方式 ipv4*/
    // int socket(int domain, int type, int protocol);
    int client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd < 0)
    {
        perror("socket");
        return -1;
    }
    /*允许端口快速重用成功*/
    int resue = 1;
    if (setsockopt(client_fd, SOL_SOCKET, SO_REUSEADDR, &resue, sizeof(resue)) < 0)
    {
        perror("setsockopt");
        return -1;
    }
    /*填充客户端地址信息结构体*/
    struct sockaddr_in client_in;
    client_in.sin_family = AF_INET;            // 必须填AF_INET
    client_in.sin_port = htons(PORT);          // 端口号,主机转网络
    client_in.sin_addr.s_addr = inet_addr(IP); // 服务器IP,
#if 0
    //此处为非必要绑定
    /*将IP和端口绑定到套接字上*/
    //int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    if (bind(client_fd, (struct sockaddr *)&server_in, sizeof(server_in)) < 0)
    {
        perror("bind");
        return -1;
    }
#endif
    /*连接服务器*/
//int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
if(connect(client_fd,(struct sockaddr*)&client_in,sizeof(client_in))<0)
{
    perror("connect");
    return -1;
}
printf("connect success __%d__\n",__LINE__);
    char buf[128] = ""; // 用于存储信息
    ssize_t res = 0;    // 接收(recv)的返回值
    while (1)
    {
        /*发送消息*/
        // ssize_t send(int sockfd, const void *buf, size_t len, int flags);
        bzero(buf,sizeof(buf));
        printf("请输入>>>");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1]=0;
        if (send(client_fd, buf, sizeof(buf), 0) < 0)
        {
            perror("send");
            return -1;
        }
        printf("发送成功\n");
        /*接受消息*/
        // ssize_t recv(int sockfd, void *buf, size_t len, int flags);
        bzero(buf, sizeof(buf));                       // 清空buf
        res = recv(client_fd, buf, sizeof(buf), 0); // 以阻塞方式接收消息
        if (res < 0)
        {
            perror("recv");
            return -1;
        }
        else if (0 == res)
        {
            printf("client_fd=%d 服务器下线:__%d__\n", client_fd, __LINE__);
            break;
        }
        printf("client_fd=%d: %s\n", client_fd, buf);
        
    }

    close(client_fd);
    return 0;
}

UDP

服务器端

// udp服务器端
#include 
#include 
#include 
#include 
#include 
#include  /* superset of previous */
#include   /* See NOTES */
#include 
#include 
#include 

#define IP "192.168.8.225" // 设置服务器IP地址
#define PORT 1024           // 设置服务器端口号为1024

int main()
{
    /*创建报式字节套,以udp方式 ipv4*/
    // int socket(int domain, int type, int protocol);
    int serve_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (serve_fd < 0)
    {
        perror("socket");
        return -1;
    }
    /*允许端口快速重用成功*/
    int resue = 1;
    if (setsockopt(serve_fd, SOL_SOCKET, SO_REUSEADDR, &resue, sizeof(resue)) < 0)
    {
        perror("setsockopt");
        return -1;
    }
    /*填充地址信息结构体*/
    struct sockaddr_in server_in;
    server_in.sin_family = AF_INET;            // 必须填AF_INET
    server_in.sin_port = htons(PORT);          // 端口号,主机转网络
    server_in.sin_addr.s_addr = inet_addr(IP); // 服务器IP,
    /*将IP和端口绑定到套接字上*/
    // int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    if (bind(serve_fd, (struct sockaddr *)&server_in, sizeof(server_in)) < 0)
    {
        perror("bind");
        return -1;
    }
    struct sockaddr_in client_in; // 存储数据包从哪里来的
    socklen_t addrlen = sizeof(client_in);
    char buf[128] = "";
    while (1)
    {
        /*接收数据,并接受对方信息*/
        // ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
        bzero(buf, sizeof(buf));
        if (recvfrom(serve_fd, buf, sizeof(buf), 0, (struct sockaddr *)&client_in, &addrlen) < 0)
        {
            perror("recvfrom");
            return -1;
        }
        printf("[%s : %d]: %s\n", inet_ntoa(client_in.sin_addr), ntohs(client_in.sin_port), buf);
        /*发送数据*/
        printf("发送>>>");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf) - 1] = 0;
        if (sendto(serve_fd, buf, sizeof(buf), 0, (struct sockaddr *)&client_in, sizeof(client_in)) < 0)
        {
            perror("sendto");
            return -1;
        }
        printf("发送成功\n");
    }

    close(serve_fd);
    return 0;
}

客户端

// udp客户端
#include 
#include 
#include 
#include 
#include 
#include  /* superset of previous */
#include   /* See NOTES */
#include 
#include 
#include 

#define IP "192.168.8.225" // 设置IP地址
#define PORT 1024           // 设置端口号为1024

int main()
{
    /*创建报式字节套,以udp方式 ipv4*/
    // int socket(int domain, int type, int protocol);
    int client_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (client_fd < 0)
    {
        perror("socket");
        return -1;
    }
    /*允许端口快速重用成功*/
    int resue = 1;
    if (setsockopt(client_fd, SOL_SOCKET, SO_REUSEADDR, &resue, sizeof(resue)) < 0)
    {
        perror("setsockopt");
        return -1;
    }

#if 0
    /*将IP和端口绑定到套接字上,此处不是必须绑定*/
    // int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    if (bind(client_fd, (struct sockaddr *)&client_in, sizeof(client_in)) < 0)
    {
        perror("bind");
        return -1;
    }
#endif
    /*填充服务器地址信息结构体,给sendto使用*/
    struct sockaddr_in serve_in;
    serve_in.sin_family = AF_INET;            // 必须填AF_INET
    serve_in.sin_port = htons(PORT);          // 端口号,主机转网络
    serve_in.sin_addr.s_addr = inet_addr(IP); // 服务器IP,

    struct sockaddr_in client_in;             // 存储数据包从哪里来的
    socklen_t addrlen = sizeof(client_in);
    char buf[128] = "";
    while (1)
    {
        /*发送数据*/
        printf("发送>>>");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf) - 1] = 0;
        if (sendto(client_fd, buf, sizeof(buf), 0, (struct sockaddr *)&serve_in, sizeof(serve_in)) < 0)
        {
            perror("sendto");
            return -1;
        }
        printf("发送成功\n");
        /*接收数据,并接受对方信息*/
        // ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
        bzero(buf, sizeof(buf));
        if (recvfrom(client_fd, buf, sizeof(buf), 0, (struct sockaddr *)&client_in, &addrlen) < 0)
        {
            perror("recvfrom");
            return -1;
        }
        printf("[%s : %d]: %s\n", inet_ntoa(client_in.sin_addr), ntohs(client_in.sin_port), buf);
    }

    close(client_fd);
    return 0;
}

你可能感兴趣的:(网络,tcp/ip,学习,linux,c语言)