zoukankan      html  css  js  c++  java
  • 【Socket】linux套接字技术之tcp

     

    1.mystery引入

     

       1)UDP也可以编写出C/S程序 ,另外TCP也可以编写点对点通信。
       2)网络的本质就是资源共享,当前流行的P2P应用正好暗合了这种精神。
       3)当前流行的Web服务,其标准协议是HTTP,很多从事Web应用程序开发的开发者,从事的就是这种应用的网络编程,所采用的开 发模式是浏览器/服务器结构,也称为B/S结构 。
       4)B/S结构是C/S结构的一个变种,是指开发者不需要开发独立的客户端软件,浏览器就是此时的客户端,开发者只需要在服务器端编写并部署脚本,资源请求者就可以通过URL进行访问了。
       5)Socket提供一种原始套接字机制,能够让开发者直接操纵IP层。
       6)利用Socket编程还可以编写出广播和组播应用程序。
       7)广播是指向当前局域网所有的在线主机发送数据,ARP协议就是利用广播机制。
       8)组播相对广播,也可了理解为广播的一个子集,类似于QQ中的群。


    2.源

     

       服务端:
    //TCPServer.c
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #define SERVER_PORT 5555
    main()
    {
        int serverSocket;
        struct sockaddr_in server_addr;
        struct sockaddr_in clientAddr;
        int addr_len = sizeof(clientAddr);
        int client;
        char buffer[1024];
        int iDataNum ;
        if((serverSocket = socket(AF_INET,SOCK_STREAM,0)) < 0)
        {
            perror("socket");
            exit(1);
        }
        bzero(&server_addr,sizeof(server_addr));
        server_addr.sin_family =AF_INET;
        server_addr.sin_port = htons(SERVER_PORT);
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        if(bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr)) < 0)
        {
            perror("connect");
            exit(1);
        }
        if(listen(serverSocket,5)<0)
        {
            perror("listen");
            exit(1);
        }
        while(1)
        {
            client = accept(serverSocket,(struct sockaddr *)&clientAddr,(socklen_t*)&addr_len);
            if(client < 0)
            {
                perror("accept");
                continue;
            }
            iDataNum = recv(client,buffer,1024,0);
            if(iDataNum < 0)
            {
                perror("Recv");
                continue;
            }
            printf("
    Recv client data.......
    ");
            printf("IP is %s
    ",inet_ntoa(clientAddr.sin_addr));
            printf("Port is %d
    ",htons(clientAddr.sin_port));
            printf("Recv Data is %s
    ",buffer);
            send(client,buffer,sizeof(buffer),0);
        }
    }
    View Code

       客服端:
    //TCPClient.c
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    main()
    {
        struct sockaddr_in serverAddr;
        int clientSocket;
        char sendbuf[200];
        char recvbuf[200];
        if((clientSocket=socket(AF_INET,SOCK_STREAM,0)) < 0)
        {
            perror( "socket error" );
            return -1;
        }
        serverAddr.sin_family=AF_INET;
        serverAddr.sin_port=htons(5555);
        serverAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
        if(connect(clientSocket,( struct sockaddr * )&serverAddr,sizeof(serverAddr)) < 0)
        {
            perror("connect");
            exit(1);
        }
        printf("connect with destination host.....
    ");
        while(1)
        {
            printf("Input your World:>");
            scanf("%s",sendbuf);
            printf("
    ");
            if(strcmp(sendbuf,"quit") == 0)
                break;
            send(clientSocket,sendbuf,sizeof(sendbuf),0);
            recv(clientSocket,recvbuf,200,0);
            printf("recv data of my world is: %s
    ",recvbuf);
        }
        close(clientSocket);
        return 0;
    }
    View Code

    3.mystery注

     

       1) addr_in存储主机IP地址
       2)sockaddr_in用于表示Internet协议簇地址结构
       3)sockaddr存储主机IP地址与接口信息
       4)addr_in是一个结构体,其中包含一个联合体,其中结构体s_un_b中的4个字段s_b1/s_b2/s_b3/s_b4分别对应IP地址点分法下的4个  值
       5)inet_addr()函数的作用是将字符形式的IP地址转换成整数值
       6)htons()和htonl()函数用于字节序的转换,表示将数值从主机字节序转换成网络字节序
       7)htons()函数是16字节序转换

       8)htonl()函数是32字节序转换

  • 相关阅读:
    微信小程序中 数据缓存
    javascript 数组去重方法
    常用网站 ---总结
    vue面试题
    vue创建项目(命令方式)
    shutil 模块:文件复制.移动.压缩.解压.递归删除文件夹
    面向对象一些零散的知识点
    面向对象之多态
    面向对象与继承
    序列化与反序列化的三个模块:json pickle shelve
  • 原文地址:https://www.cnblogs.com/lcw/p/3159514.html
Copyright © 2011-2022 走看看