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. 使用批处理文件在FTP服务器 上传下载文件

    1.从ftp服务器根目录文件夹下的文件到指定的文件夹下 格式:ftp -s:[配置文件] [ftp地址] 如:ftp -s:c:\vc\ftpconfig.txt   192.168.1.1 建立一个 ...

  2. 网络编程之socket

    网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...

  3. new date() 在Linux下引起的时间差问题

    java工程部署到Linux时,使用new date()获取的时间出现时间差,通过查阅资料,发现有可能是服务器时间设置问题,JVM问题,jdk问题: 1.服务器时间设置问题: 正确的时间显示 有 CS ...

  4. Print all nodes at distance k from a given node

    Given a binary tree, a target node in the binary tree, and an integer value k, print all the nodes t ...

  5. 九、Java基础---------面向对象封装、继承、多态

    封装 1.1 基本概念  封装(encapsulation)是面向对象三大特征之一,它是指将对象的状态信心隐藏在对象的内部,不允许外部直接进行访问,而是通过该类提供的方法来实现对内部信息的操作和访问. ...

  6. C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)

    C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的 ...

  7. Oracle11g空表导出方法

    今天凌晨在客户现场进行一个Oracle11g的数据库迁移,习惯性的用了exp/imp,然后在新的数据库发现,空表根本没有exp出来,然后查资料,发现了如下信息:[ORACLE 11G在用EXPORT导 ...

  8. 身份证上的X到底代表什么?

    生活中,无论你是坐火车,还是办理各种手续,都需要用到身份证,它现在已经俨然成为我们生活的非常重要的一部分,但是关于身份证本身,你了解多少呢? 有人会说了,为什么我的身份证上写的有效时间是10年,而一些 ...

  9. oc-31-多对象的内存管理

    在每个OC对象内部,都专门有8个字节的存储空间来存储引用计数器. 引用计数器的常见操作 retain消息:堆内存中对象的计数器变量 +(该方法返回对象本身,要想计数器变量加1就要调用对象的retain ...

  10. Connected_Component Labelling(联通区域标记算法) C++实现

    // Connected-Component Labelling.cpp : 定义控制台应用程序的入口点.//如有是使用,请务必注明引用出处网站:http://www.cnblogs.com/Amat ...