Linux Socket通信

udp socket的bind问题

客户端 用不用 bind 的区别

TCP:

服务端基本流程:

    socket --> bind --> listen --> accept --> send/recv --> close

void server_tcp() {    //服务端
    int n;
    char buf[20];

    sockaddr_in addr;
    socklen_t len(sizeof(addr));
    addr.sin_family = AF_INET;
//    inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr.s_addr);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(6666);
    memset(&addr.sin_zero[0], 0, 8);


    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    print("sockfd:", sockfd);

    int client_fd;
    char client_ip[20];

    if (bind(sockfd, (struct sockaddr *) &addr, len) == -1) {
        print("bind error");
        goto errloop;
    }

    if (listen(sockfd, 5) == -1) {
        print("listen error");
        goto errloop;
    }

    if ((client_fd = accept(sockfd, (struct sockaddr *) &addr, &len)) == -1) {
        print("listen error");
        goto errloop;
    }

    inet_ntop(AF_INET, &addr.sin_addr, client_ip, 20);
    print("client_fd:", client_fd);
    print("client_ip:", client_ip);

    int sendbytes;
    while (n = read(STDIN_FILENO, buf, 10)) {
        if ((sendbytes = send(client_fd, buf, n, 0)) == -1) {
            print("send error");
        }
        if(buf[0] == 'q'){
            break;
        }
    }

    errloop:
    close(sockfd);
}

客户端:

    socket --> connect --> send/recv --> close

void client_tcp(){
    int n, bufsize(1024);
    char buf[bufsize];
    sockaddr_in addr;
    socklen_t len(sizeof(addr));

    addr.sin_family = AF_INET;
    inet_pton(AF_INET, "192.168.191.3", &addr.sin_addr.s_addr);
    addr.sin_port = htons(6666);
    memset(&addr.sin_zero[0], 0, 8);

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    print("sonsockfd:", sockfd);
    fflush(stdout);

    if(connect(sockfd, (struct sockaddr *)&addr, len) == -1){
        print("connect error");

        return;
    }
    print("Link ok");
    fflush(stdout);
    while(n = recv(sockfd, buf, bufsize, 0)){
        buf[n] = 0;
        if(buf[0] == 'q') break;
        print(buf);
        fflush(stdout);
    }

    close(sockfd);
}


UDP:

服务端:

    socket --> bind(有无影响不大) --> sendto/recvfrom

void server_udp(){
    int socketfd;
    sockaddr_in addr = {0};
    sockaddr sockp;

    socketfd = socket(AF_INET, SOCK_DGRAM, 0);

    int n;
    char buf[10];
    sockaddr_in client_addr = {0};
    client_addr.sin_family = AF_INET;
//    inet_pton(AF_INET, "127.0.0.1", &client_addr.sin_addr.s_addr);
    client_addr.sin_addr.s_addr = INADDR_ANY;
    client_addr.sin_port = htons(6667);
    socklen_t len = sizeof(client_addr);

    while (n = read(STDIN_FILENO, buf, 10)) {

        if (sendto(socketfd, buf, n, 0, (sockaddr *)&client_addr, len) == -1) { //client_addr中有目标地址,不需要bind
            print("send error");
        }else{
            print("send ok");
        }

        if(buf[0] == 'q'){
            break;
        }
    }
    
    close(socketfd);
}

客户端:

    socket --> bind --> sendto/recvfrom

void client_udp(){
	int n, bufsize(1024);
    char buf[bufsize];
    sockaddr_in ser_addr = {0};
    socklen_t len(sizeof(ser_addr));

    ser_addr.sin_family = AF_INET;
//    inet_pton(AF_INET, "127.0.0.1", &ser_addr.sin_addr.s_addr);
    ser_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    ser_addr.sin_port = htons(6667);
//    memset(&addr.sin_zero[0], 0, 8);

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    bind(sockfd, (sockaddr *)&ser_addr, len);    //要确定从哪接收或发送数据
    print("sonsockfd:", sockfd);
    fflush(stdout);

    while(n = recvfrom(sockfd, buf, 10, 0, (sockaddr *)&ser_addr, &len)){
        buf[n] = 0;
        if(buf[0] == 'q') break;
        print(buf);
        fflush(stdout);
    }

    close(sockfd);
}





猜你喜欢

转载自blog.csdn.net/m_n_n/article/details/80215524