netstat -na | grep " --查看TCP/IP协议连接状态
//socket编程提高版--服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main(int arg, char *args[])
{
    );
    )
    {
        perror("socket() err");
        ;
    }
    //地址复用
    ;
    )
    {
        perror("setsockopt() err");
        ;
    }
    //
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons();
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    /*
     * INADDR_ANY表示的是IP地址(0,0,0,0)这样的主机字节序变量
     * 本来主机字节序变量转化成网络字节序变量,需要使用htonl()函数,
     * 但是INADDR_ANY比较特殊,它的所有位都是0,不存在大端字节序或者小端字节序的情况
     * 所以不需要使用htonl()函数
     * */
    //表示绑定任意一个地址(但是不推荐,最好使用本机ip地址)
    //addr.sin_addr.s_addr=INADDR_ANY;
    )
    {
        perror("bind() err");
        ;
    }
    /*
     * 一旦调用listen函数,这个套接字sockfd将变成被动套接字,只能接受连接,不能主动发送连接
     * */
    )
    {
        perror("bind() err");
        ;
    }
    struct sockaddr_in peeraddr;
    socklen_t peerlen = sizeof(peeraddr);
    int conn = accept(sockfd, (struct sockaddr *) &peeraddr, &peerlen);
    )
    {
        perror("accept() err");
        ;
    }
    printf("accept by :%s \n", inet_ntoa(peeraddr.sin_addr));
    ] = {  };
    )
    {
        int rc = read(conn, recvbuf, sizeof(recvbuf));
        )
        {
            printf("client is closed !\n");
            break;
        } )
        {
            printf("read() failed ! error message:%s\n", strerror(errno));
            break;
        }
        printf("recv message:%s\n", recvbuf);
        write(conn, recvbuf, rc);
        memset(recvbuf, , sizeof(recvbuf));
    }
    close(conn);
    close(sockfd);
    ;
}
//socket编程提高版--客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main(int arg, char *args[])
{
    );
    )
    {
        perror("socket() err");
        ;
    }
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons();
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    )
    {
        perror("socket() err");
        ;
    }
    ]={};
    ]={};
    while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL)
    {
        //send
        write(sockfd,sendbuf,sizeof(sendbuf));
        //recv
        int rc=read(sockfd,recvbuf,sizeof(recvbuf));
        )
        {
            perror("read() error");
            break;
        })
        {
            printf("connect is cloesd !\n");
            break;
        }
        printf("recv message:%s\n",recvbuf);
        memset(sendbuf,,sizeof(sendbuf));
        memset(recvbuf,,sizeof(recvbuf));
    }
    ;
}
//socket编程提高版--多进程版服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main(int arg, char *args[])
{
    );
    )
    {
        perror("socket() err");
        ;
    }
    //地址复用
    ;
    )
    {
        perror("setsockopt() err");
        ;
    }
    //
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons();
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    /*
     * INADDR_ANY表示的是IP地址(0,0,0,0)这样的主机字节序变量
     * 本来主机字节序变量转化成网络字节序变量,需要使用htonl()函数,
     * 但是INADDR_ANY比较特殊,它的所有位都是0,不存在大端字节序或者小端字节序的情况
     * 所以不需要使用htonl()函数
     * */
    //表示绑定任意一个地址(但是不推荐,最好使用本机ip地址)
    //addr.sin_addr.s_addr=INADDR_ANY;
    )
    {
        perror("bind() err");
        ;
    }
    /*
     * 一旦调用listen函数,这个套接字sockfd将变成被动套接字,只能接受连接,不能主动发送连接
     * */
    )
    {
        perror("bind() err");
        ;
    }
    //int conn = 0;
    )
    {
        struct sockaddr_in peeraddr;
        socklen_t peerlen = sizeof(peeraddr);
        int conn = accept(sockfd, (struct sockaddr *) &peeraddr, &peerlen);
        )
        {
            perror("accept() err");
            ;
        }
        printf("accept by :%s \n", inet_ntoa(peeraddr.sin_addr));

        int pid = fork();
        )
        {
            perror("fork() err");
            break;
        }
        )
        {
            ] = {  };
            )
            {
                int rc = read(conn, recvbuf, sizeof(recvbuf));
                )
                {
                    printf("client is closed !\n");
                    break;
                } )
                {
                    printf("read() failed ! error message:%s\n",
                            strerror(errno));
                    break;
                }
                printf("recv message:%s\n", recvbuf);
                write(conn, recvbuf, rc);
                memset(recvbuf, , sizeof(recvbuf));
            }
            close(conn);
            close(sockfd);
            exit();
        } else
        {
            close(conn);
        }
    }
    close(sockfd);
    ;
}

Linux 网络编程详解二(socket创建流程、多进程版)的更多相关文章

  1. Linux 网络编程详解九

    TCP/IP协议中SIGPIPE信号产生原因 .假设客户端socket套接字close(),会给服务器发送字节段FIN: .服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所 ...

  2. Linux 网络编程详解三(p2p点对点聊天)

    //p2p点对点聊天多进程版--服务器(信号的使用) #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  3. Linux 网络编程详解五(TCP/IP协议粘包解决方案二)

    ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...

  4. Linux 网络编程详解十二

    UDP的特点 --无连接 --基于消息的数据传输服务 --不可靠 --UDP更加高效 UDP注意点 --UDP报文可能会丢失,重复 --UDP报文可能会乱序 --UDP缺乏流量控制(UDP缓冲区写满之 ...

  5. Linux 网络编程详解七(并发僵尸进程处理)

    在上一篇程序框架中,解决了子进程退出,父进程继续存在的功能,但是多条客户端连接如果同一时间并行退出,导致服务器端多个子进程同一时间全部退出,而SIGCHLD是不可靠信号,同时来多条信号可能无法处理,导 ...

  6. Linux 网络编程详解四(流协议与粘包)

    TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...

  7. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

    IPv4套接字地址结构 struct sockaddr_in { uint8_t sinlen;(4个字节) sa_family_t sin_family;(4个字节) in_port_t sin_p ...

  8. Linux 网络编程详解十一

    /** * read_timeout - 读超时检测函数,不含读操作 * @fd:文件描述符 * @wait_seconds:等待超时秒数,如果为0表示不检测超时 * 成功返回0,失败返回-1,超时返 ...

  9. Linux 网络编程详解十

    select int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *tim ...

随机推荐

  1. GJM : Unity3D 高通Vuforia SDK AR 开发

    一.AR概念: 增强现实(Augmented Reality,简称AR),是在虚拟现实的基础上发展起来的新技术,也被称之为混合现实.是通过计算机系统提供的信息增加用户对现实世界感知的技术,将虚拟的信息 ...

  2. WCF传输图片解决方案

    图片无法序列化后传输,但我们可以将图片转二进制字符串传输.然后在服务端将二进制字符串转图片. 将图片转字符串的例子: private byte[] BmpToJpegBuff(Image img) { ...

  3. HTML5能取代IOS原生应用吗

    介绍 移动应用程序(App)和HTML5都是目前最火的技术,二者之间也有不少重叠之处.在移动设备浏览器里运行的html5的web页面,也可以重新打包成不同平台上运行的app.目前很多浏览器都有很好的跨 ...

  4. C/C++文件操作1

    在C语言中,文件操作都是由库函数来完成的. 在本章内将介绍主要的文件操作函数. 文件打开函数fopen fopen函数用来打开一个文件,其调用的一般形式为:文件指针名=fopen(文件名,使用文件方式 ...

  5. TIME_WAIT是什么?http连接

    http连接分为:建立连接,即tcp三次握手 发送请求信息 发送响应信息 关闭连接(tcp四次握手):下面讲此过程: 在TCP断开的过程中会有四个状态变化过程,如下图所示: 在连接撤销过程中,有如下过 ...

  6. 关于server的一些小记

    一. 批量创建用户 1. Import-Module ActiveDirectory 2. import-csv e:\users\newusers.csv | 3. New-ADUser -path ...

  7. Oracle RAC 客户端连接负载均衡(Load Balance)

    实现负载均衡(Load Balance)是Oracle RAC最重要的特性之一,主要是把负载平均分配到集群中的各个节点,以提高系统的整体吞吐能力.通常情况下有两种方式来实现负载均衡,一个是基于客户端连 ...

  8. ubuntu16.04添加开机启动任务

    比如要把run-nexus.sh这个脚本制作成开机启动项. 系统工具->首选项->启动应用程序.添加该文件,即可.

  9. 数据结构之顺序表,c#实现

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  10. android之存储篇_存储方式总览

    作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...