04-客户端代码

118 阅读1分钟

客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//! socket 在连接地址的时候用的是另一种字节序// 宏定义服务器端口号 
#define SERVER_PORT 6666
//! 这里不要搞糊涂了,因为现在编写的服务器和客户端代码都在虚拟机上,所以客户端发起连接,要连接的IP是127.0.0.1 本机回环地址
#define SERVER_IP "127.0.0.1"
//! 这样写可以直接执行命令的时候带上参数
int main(int argc, char *argv[])
{
    //! 客户端也得准备一个信箱,把信件投递到信箱中
    int sockfd;
​
    //! 标签 
    struct sockaddr_in servaddr;
​
    //! 要传给服务器端的信息
    char* message;
​
    int len;
    char buf[64];
    if (argc != 2)
    {
        //! 输出消息到标准出错
        fputs("Usage: ./echo_client message \n", stderr);
​
        //! 结束
        exit(1);
    }   
​
    message = argv[1];
​
    printf ("message: %s\n", message);
​
    //! 创建
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
​
    //! 对标签清零
    memset(&servaddr, '\0', sizeof(servaddr));
​
    //! 协议家族
    servaddr.sin_family = AF_INET;
​
    //! 要把字符串的IP地址,转换成网络字节即socket函数能接收的地址
    //! 连到本机 使用环回接口
    inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr); //! 将字符串IP地址转化成网络字节序的IP地址
    servaddr.sin_port = htons(SERVER_PORT);
​
    //! 照着这个标签上的地址去连接
    connect(sockfd, (struct sockaddr *)&servaddr, sizeof (servaddr));
​
    //! 写信息
    write(sockfd, message, strlen(message));
​
    //! 从信箱中读传回的信息存储在buf中
    len = read(sockfd, buf, sizeof(buf) - 1);
    if (len > 0)
    {
        buf[len] = '\0';
        printf ("receive : %s\n", buf);
    }
    else 
    {
        perror("error!!!!!!");
    }
    printf ("finished\n");
​
    //! 使用完之后要清理套接字 - 挂机
    close(sockfd);
    return 0;
}
​
​
  • 因为TCP是面向连接的,就像打电话一样,拨通电话后,这样客户端这边发给来的信息就可以马上收到,而服务器端这边不用再回拨回去,因为通道已经建立了(双方可以不停说话),读写连续;