Liunx的socket通讯的流程图分析

来源:互联网 发布:淘宝有多少个商品种类 编辑:程序博客网 时间:2024/06/06 10:37

一, socket服务端和客户的通信流程

这里写图片描述

二,分析代码的实现

1,这边我说的转换网络的ip地址其实是01010的数字封装在网络层的

  1. int inet_pton(int af, const char *src, void *dst); // 转换网络的ip地址
  2. uint32_t htonl(uint32_t hostlong); //ip地址数字转换成网络ip地址的
  3. uint16_t htons(uint16_t hostshort); //端口号数字转换成网络信息的端口号地址
  4. uint32_t ntohl(uint32_t netlong);
  5. uint16_t ntohs(uint16_t netshort);

代码的实现

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include <arpa/inet.h>#include <sys/socket.h>#include <ctype.h>#include "wrap.h"#include <sys/wait.h>void wait_child(void * signo){    while ( waitpid(0, NULL, WNOHANG) > 0);    return;}#define SERV_PORT 8888int main(int argc, char *argv[]){    //id进程    pid_t pid;    //socket的描述符    int lfd, cfd;    int i, n;    char buf[BUFSIZ], clie_IP[BUFSIZ];    struct sockaddr_in  serv_addr, clie_addr;    socklen_t clie_addr_len;    //创建一个socket    lfd = Socket(AF_INET, SOCK_STREAM, 0);     bzero(&serv_addr, sizeof(serv_addr));    //初始化操作    serv_addr.sin_family = AF_INET;    serv_addr.sin_port = htons(SERV_PORT);    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);    //固定ip地址的操作    // inet_pton(AF_INET, "127.0.0.1", serv_addr.sin_addr.s_addr);    //绑定ip地址和端口号    Bind(lfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr));    //连数量     Listen(lfd, 128);    while (1)    {        clie_addr_len = sizeof(clie_addr);        cfd = Accept(lfd,(struct sockaddr *) &clie_addr, &clie_addr_len);        printf("client IP:%s, port:%d\n",                 inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)),                 ntohs(clie_addr.sin_port));        //开启子 进程            pid = fork();        if (pid < 0)        {            perror("fork error");            exit(1);        }else if (pid == 0)        {            close(lfd);            break;        } else         {            //父进程的处理            close(cfd);            //注册            signal(SIGCHLD, wait_child);        }    }    if (pid == 0)    {        while (1)        {            //读取数据            n =  Read(cfd, buf, sizeof(buf));            if ( n == 0) // client close            {                Close(cfd);                return 0;             } else if(n == -1)            {                //信号打断                perror("read error");                exit(1);            }             else{                for (i = 0; i < n; i++)                    buf[i] = toupper(buf[i]);                write(cfd, buf, n);                printf("客户端:", buf);            }        }    }    //关闭连接    Close(lfd);    return 0;}

这里写图片描述

三,客户端client

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>#include <sys/socket.h>//socket 的结构体#include <arpa/inet.h>#include <ctype.h>/** *   client 端 **/#define SERV_IP "127.0.0.1"#define SERV_PORT 8888int main(int argc, char *argv[]){    // socket 描述符    int cfd;    //服务器的ip地址    struct sockaddr_in serv_addr;    //socklen_t serv_addr_len;    //缓冲区     char buf[BUFSIZ];    //创建一个socket    cfd = socket(AF_INET, SOCK_STREAM, 0);    memset(&serv_addr, 0, sizeof(serv_addr));    serv_addr.sin_family = AF_INET;    serv_addr.sin_port = htons(SERV_PORT);    //serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);    inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);    //链接    connect(cfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));    while (1)    {        //获取键盘内容        fgets(buf, sizeof(buf), stdin);        //写数据        write(cfd, buf, strlen(buf)); // fgets ---> hello \n\0         //读取服务器的数据        int n = (int)read(cfd, buf, sizeof(buf));        //strncat("服务器发送的数据:", buf, n);        //write(STDOUT_FILENO, buf, n);        printf("服务器发送的数据:%s", buf);    }    //绑定    //bind();    close(cfd);     return 0;}

效果图

这里写图片描述

原创粉丝点击