博客
关于我
Linux ---> 简单socket
阅读量:790 次
发布时间:2023-01-31

本文共 3280 字,大约阅读时间需要 10 分钟。

服务器端代码示例

这段代码实现了一个简单的TCP服务器端程序,主要使用了socket()bind()listen()accept()函数完成监听和连接处理。以下是代码的详细说明:

  • socket()函数:创建一个IPv4地址族的TCP socket。成功返回文件描述符,失败返回-1。
  • #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    1. 端口定义与socket创建:定义了一个服务端口3333,并尝试创建socket。如果创建失败,会打印错误信息并退出程序。
    2. #define SERVPORT 3333#define BACKLOG 10int main(void) {    int sockfd;    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {        printf("socket 创建失败!");        exit(1);    }    printf("创建监听socket成功。\n");
      1. 地址配置:使用socklen_t结构体myAddr配置socket地址信息。filled my sin_zero部分以确保结构体对齐。
      2. struct sockaddr_in myAddr;myAddr.sin_family = AF_INET;myAddr.sin_port = htons(SERVPORT);myAddr.sin_addr.s_addr = INADDR_ANY;bzero(&myAddr.sin_zero, 8);
        1. 绑定socket:将创建好的socket绑定到指定的本地地址。如果绑定失败,会打印错误信息并退出程序。
        2. if (bind(sockfd, (struct sockaddr *)&myAddr, sizeof(struct sockaddr)) == -1) {    printf("bind 出错!");    exit(1);}printf("socket绑定成功。\n");
          1. 监听并接受连接:设置监听队列大小为BACKLOG(即最多10个未接受的连接请求),并进入主循环处理客户端连接。
          2. printf("服务端开始listen......\n");int lisVal = listen(sockfd, BACKLOG);printf("zhi %d", lisVal);if (lisVal == -1) {    printf("listen 出错!");    exit(1);}printf("------listen is ok----\n");while (1) {
            1. 客户端连接处理:使用accept()函数等待并接受客户端连接。如果连接成功,会打印客户端地址信息,并进入子进程处理数据传输。
            2. struct sockaddr_in remoteAddr;int clientFd;int sin_size = sizeof(struct sockaddr_in);printf("----------");if ((clientFd = accept(sockfd, (struct sockaddr *)&remoteAddr, &sin_size)) == -1) {    printf("accept erro!");    continue;}
              1. 消息传输:子进程向客户端发送消息。如果发送失败,会打印错误信息并关闭socket。
              2. if (!fork()) {    char* msg = "连接上了,来自服务端的消息。\n";    if (send(clientFd, msg, sizeof(msg), 0) == -1) {        printf("send 出错!");        close(clientFd);        exit(0);    }}close(clientFd);

                客户端连接代码示例

                这段代码实现了一个TCP客户端程序,主要使用了socket()connect()recv()函数完成连接和数据接收。以下是代码的详细说明:

                #include 
                #include
                #include
                #include
                #include
                #include
                #include
                #include
              3. 端口定义与socket创建:定义了一个服务端口3333,尝试创建一个TCP socket。如果创建失败,会打印错误信息并退出程序。
              4. #define SERPORT 3333#define MAXDATASIZE 100char* DES = "127.0.0.1"; // 目的地址int main(int argc, char* *argv) {    struct hostent *host;    int sockfd;    // 如果无需指定服务器地址,可以省略这一部分    if ((host = gethostbyname(DES)) == NULL) {        printf("gethostbyname错误!");        exit(1);    }    printf("目的地址为:%s\n", host->h_name);
                1. 配置与连接:将socket连接到指定的服务器地址。使用htons()转换端口号,servAddr结构体存储服务器地址信息。
                2. struct sockaddr_in servAddr;servAddr.sin_family = AF_INET;servAddr.sin_port = htons(SERPORT);servAddr.sin_addr = *((struct in_addr *)host->h_addr);bzero(&servAddr.sin_zero, 8);if (connect(sockfd, (struct sockaddr *)&servAddr, sizeof(struct sockaddr)) == -1) {    printf("连接出错\n");    exit(1);}printf("连接成功。\n");
                  1. 数据接收与处理:接收来自服务器端的数据,存储在缓冲区buf中。如果接收失败,会打印错误信息。
                  2. int recvbytes = 0;char buf[MAXDATASIZE];if ((recvbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {    printf("接收出错!");    exit(1);}buf[recvbytes] = '\0';printf("收到信息:%s\n", buf);
                    1. 关闭socket:在程序结束时,确保正确关闭已连接的socket。
                    2. printf("结束\n");close(sockfd);return 0;}

                      总结

                      以上代码示例展示了TCP协议在服务器端和客户端的典型应用,实现了基本的连接监听和数据交互功能。无论是服务器端的listen()逻辑,还是客户端的connect()recv()逻辑,都体现了TCP协议在网络通信中的重要作用。

    转载地址:http://sywfk.baihongyu.com/

    你可能感兴趣的文章
    LeetCode二叉树从上至下路径问题总结(112.113.437.129)
    查看>>
    leetcode出现cannot find symbol [in __Driver__.java]
    查看>>
    LeetCode哈希表+字符类的题目总结
    查看>>
    LeetCode地平线专场——第308场周赛题解
    查看>>
    LeetCode数据库题目汇总二(附答案)
    查看>>
    LeetCode智加科技专场——第207场周赛题解
    查看>>
    LeetCode蔚来专场——第208场周赛题解
    查看>>
    leetcode题解-买卖股票的最佳时机
    查看>>
    leetcode题解102-二叉树的层序遍历
    查看>>
    leetcode题解102-翻转二叉树
    查看>>
    leetcode题解104- 二叉树的最大深度
    查看>>
    leetcode题解108-将有序数组转换为二叉排序树
    查看>>
    leetcode题解118-杨辉三角
    查看>>
    leetcode题解136-只出现一次的数字
    查看>>
    leetcode题解14-最长公共前缀
    查看>>
    leetcode题解167-两数之和 II - 输入有序数组
    查看>>
    leetcode题解173-二叉搜索树迭代器
    查看>>
    leetcode题解189-旋转数组
    查看>>
    leetcode题解191-位1的个数
    查看>>
    leetcode题解20-有效的括号
    查看>>