2020/2/16 学习Linux Socket编程 客户端

1. 客户端的代码比服务端简单一些:

#include <netdb.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    if(argc < 3){
        printf("usage: %s ip port\n", argv[0]);
        exit(1);
    }
    
    /*step 1 creat socket*/
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0){
        perror("socket error");
        exit(1);
    }

    struct sockaddr_in serveraddr;
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port   = htons(atoi(argv[2]));//argv[1]=ip_addr 
    /*host(192...) to net (server's ip address from terminal), then add in serveraddr    */
    inet_pton(AF_INET, argv[1], &serveraddr.sin_addr.s_addr);

    /*step 2 connect()*/
    if(connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0){
        perror("connect error");
        exit(1);
    }
    /*step 3 IO function: read/write*/
    char buffer[1024];
    memset(buffer, 0, sizeof(buffer));
    size_t size;
    if((size = read(sockfd, buffer, sizeof(buffer))) < 0){
        perror("read error");
    }
    if(write(STDOUT_FILENO, buffer, size) != size){
        perror("write error");
    }

    /*step 6 close socket*/
    close(sockfd);

    return 0;
}

2. 注意添加头文件#include <unistd.h>

这个头文件中的接口,定义了linux/unix的系统调用,如read/write/getpid等

STDOUT_FILENO是标准输出,STDIN_FILENO是标准输入,STDERR_FILENO是标准出错,它们是文件描述符,是int类型(一般为0 1 2),是没有buffer的IO,在write、read、open、close函数中直接进行系统调用;

而stdin、stdout、stderr标准IO描述字是FILE *类型,定义在<stdio.h>中,用在fwrite、fread、fopen、fclose函数。

3. 与服务器进行连接

客户端接收到了服务端返回的系统时间

服务端可以看到连接上的客户端信息(addr port),这个端口是系统分配的

发布了4 篇原创文章 · 获赞 3 · 访问量 144

猜你喜欢

转载自blog.csdn.net/Xinyue_Lu/article/details/104345329
今日推荐