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字节序转换

  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/lcw/p/3159514.html
Copyright © 2011-2022 走看看