zoukankan      html  css  js  c++  java
  • Linux 网络编程一步一步学(一)简单客户端编写

    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/socket.h>
    #include <resolv.h>
    #include <stdlib.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #define MAXBUF 1024
    int main(int argc, char **argv)
    {
        int sockfd;
        struct sockaddr_in dest;
        char buffer[MAXBUF];
        if (argc != 3) {
            printf("参数格式错误!正确用法如下:\n\t\t%s IP 地址 端口\n\t比如:\t%s 127.0.0.1 80\n此程序用来从某个 IP 地址的服务器某个端口接收最多 MAXBUF 个字节的消息\n", argv[0], argv[0]);
            exit(0);
        }
        /* 创建一个 socket 用于 tcp 通信 */
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
            perror("Socket");
            exit(errno);
        }
        /* 初始化服务器端(对方)的地址和端口信息 */
        bzero(&dest, sizeof(dest));
        dest.sin_family = AF_INET;
        dest.sin_port = htons(atoi(argv[2]));
        if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {
            perror(argv[1]);
            exit(errno);
        }
        /* 连接服务器 */
        if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
            perror("Connect ");
            exit(errno);
        }
        /* 接收对方发过来的消息,最多接收 MAXBUF 个字节 */
        bzero(buffer, MAXBUF);
        recv(sockfd, buffer, sizeof(buffer), 0);
        printf("%s", buffer);
        /* 关闭连接 */
        close(sockfd);
        return 0;
    }

    函数说明

    1、socket 

      函数原型 int socket(int domain, int type, int protocol);
      第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
      第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW;
      第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在Internet通讯域中,此参数一般取值为0,系统会根据套接字的类型决定应使用的传输层协议。

    2、sockaddr_in 结构体 

      struct sockaddr_in{

        short sin_family;
        unsigned short sin_port;
        struct in_addr sin_addr;
        char sin_zero[8];
      };
      参数
        sin_family  地址族 (必须是 AF_INET)。
        sin_port   IP 端口。
        sin_addr   IP 地址。
        sin_zero     若要使框架相同大小的填充与 SOCKADDR。

    3、atoi  功 能: 把字符串转换成整型数。

    4、htons  将一个无符号短整型数值转换为网络字节序

    5、int connect(int sockfd, struct sockaddr * serv_addr, int addrlen);

      函数说明:connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址。参数addrlen 为sockaddr 的结构长度。

      返回值:成功则返回0, 失败返回-1, 错误原因存于errno 中。

    6、int recv(int s, void *buf, int len, unsigned int flags);

      函数说明:recv()用来接收远端主机经指定的socket 传来的数据, 并把数据存到由参数buf 指向的内存空间, 参数len 为可接收数据的最大长度。参数flags一般设置为0;

    7、inet_aton()是一个改进的方法来将一个字符串IP地址转换为一个32位的网络序列IP地址。 

      inet_aton(const char *string, struct in_addr*addr);
      参数描述:
        1 输入参数string包含ASCII表示的IP地址。
        2 输出参数addr是将要用新的IP地址更新的结构。
      返回值:如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零。使用这个函数并没有错误码存放在errno中,所以他的值会被忽略。

  • 相关阅读:
    yii2 gii 命令行自动生成控制器和模型
    控制器中的方法命名规范
    Vue Property or method "" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based
    IDEA插件:GsonFormat
    Spring Boot : Access denied for user ''@'localhost' (using password: NO)
    Typora添加主题
    Git基础命令图解
    Java Joda-Time 处理时间工具类(JDK1.7以上)
    Java日期工具类(基于JDK1.7版本)
    Oracle SQL Developer 连接Oracle出现【 状态: 失败 -测试失败: ORA-01017: invalid username/password; logon denied】
  • 原文地址:https://www.cnblogs.com/liqiu/p/2980603.html
Copyright © 2011-2022 走看看