TCP socket编程(套接字编程)基础

这学期有这门课,所以学习了一波套接字编程,其实我这算是预习了hhhhhhh

本篇主要介绍如何运行程序(我最讨厌博客主直接上代码,都不说怎么用,那有个jb用呀),基本概念可以参考这篇博客:https://blog.csdn.net/lihao21/article/details/64624796,以后我会自己写一份关于套接字编程的基本概念的博客的。

套接字(socket)是一种通信机制,凭借这种机制,客户与服务器的通信既可以在本地单机上进行,也可以跨网络进行。

关于这张图,关键记住就是:server端先开启,监听有没有client连接自己,然后运行客户端程序。

下面上实例:你要写两个程序,一个是客户端client的,一个是服务器端server的。

这里server.c是服务器端的程序,socket.c是客户端的程序。a.out是server.c编译的默认文件,下面看一下这两个程序里都是啥。

首先server.c

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

int main(int argc, char **argv)
{
    // 创建套接字
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        perror("cannot create socket");
        return 0;
    }
    printf("created socket, server_fd: %d\n", server_fd);

    // 命名套接字
    struct sockaddr_in server_addr;
    memset((void *)&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(6240);
    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("bind failed");
        return 0;
    }
    printf("bind complete, port number: %d\n", ntohs(server_addr.sin_port));

    // 创建套接字队列
    if (listen(server_fd, 5) < 0) {
        perror("listen failed");
        exit(1);
    }
    printf("socket listen, server_fd: %d\n", server_fd);

    // 服务器等待客户连接
    const int MAXBUF = 256;
    char buffer[MAXBUF];
    struct sockaddr_in client_addr;
    int client_addr_len = sizeof(client_addr);
    int client_fd;
    while (1) {
        client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
        printf("accept client, client fd: %d, ip: %s, port: %d\n", client_fd,
               inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

        // 接收数据
        int nbytes = read(client_fd, buffer, MAXBUF);
        printf("read from client, bytes: %d, data: %s\n", nbytes, buffer);

        // 关闭套接字
        close(client_fd);
    }
}

客户端的socket.c

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

int main(int argc, char **argv) {
    // 创建套接字
    int client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd < 0) {
        perror("cannot create socket");
        return 0;
    }
    printf("created socket, client_fd: %d\n", client_fd);

    // 命名套接字,客户端由内核选择IP地址和端口
    struct sockaddr_in client_addr;
    memset((char *)&client_addr, 0, sizeof(client_addr));
    client_addr.sin_family = AF_INET;
    client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    client_addr.sin_port = htons(0);
    if (bind(client_fd, (struct sockaddr *)&client_addr,
             sizeof(client_addr)) < 0) {
        perror("bind failed");
        return 0;
    }

    // 构造服务器的地址
    const char *server = "10.136.52.42";  // 服务器IP
    struct sockaddr_in server_addr;
    memset((char*)&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    inet_aton(server, &server_addr.sin_addr);
    server_addr.sin_port = htons(6240);

    // 请求连接服务器
    int result = connect(client_fd, (struct sockaddr *)&server_addr,
                         sizeof(server_addr));
    if (result < 0) {
        perror("connect failed");
    }

    // 发送数据
    int MAXBUF = 256;
    char buffer[MAXBUF];
    strcpy(buffer,"hello tcp");
    int nbytes = write(client_fd, buffer, 10);
    printf("write to server, bytes: %d, data: %s\n", nbytes, buffer);

    // 关闭套接字
    close(client_fd);
}

说明:我这是单机测试,我的服务器ip地址是:10.136.52.42(大网IP哈哈哈),要根据自己主机的IP地址修改

首先运行服务器端程序:

然后开另一个终端运行客户端程序:

以上就是程序运行的结果

猜你喜欢

转载自blog.csdn.net/salmonwilliam/article/details/82454391
今日推荐