zoukankan      html  css  js  c++  java
  • BSDSocket编程之TCP

    TCPClient

     1 /*TCP/IP应用编程接口(API)*/
    2 /*
    3 *客户端的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数
    4 *将其与本机地址以及一个本地端口号绑定,请求连接服务器,通过新的socket
    5 *向客户端发送字符串" hi,I am client!"。最后关闭该socket。
    6 */
    7 #include<stdio.h>
    8 #include<stdlib.h>
    9 #include<string.h>
    10 #include<errno.h>
    11 #include<sys/types.h>
    12 #include<sys/socket.h>
    13 #include<netinet/in.h>
    14
    15 int main()
    16 {
    17 int cli_sockfd;/*客户端SOCKET */
    18 int addrlen;
    19 char seraddr[14];
    20 struct sockaddr_in ser_addr,/* 服务器的地址*/
    21 cli_addr;/* 客户端的地址*/
    22 char msg[MAX_MSG_SIZE];/* 缓冲区*/
    23 GetServerAddr(seraddr);
    24 cli_sockfd=socket(AF_INET,SOCK_STREAM,0);/*创建连接的SOCKET */
    25 if(ser_sockfd<0)
    26 {/*创建失败 */
    27 fprintf(stderr,"socker Error:%s\n",strerror(errno));
    28 exit(1);
    29 }
    30 /* 初始化客户端地址*/
    31 addrlen=sizeof(struct sockaddr_in);
    32 bzero(&ser_addr,addrlen);
    33 cli_addr.sin_family=AF_INET;
    34 cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    35 cli_addr.sin_port=0;
    36 if(bind(cli_sockfd,(struct sockaddr*)&cli_addr,addrlen)<0)
    37 {
    38 /*棒定失败 */
    39 fprintf(stderr,"Bind Error:%s\n",strerror(errno));
    40 exit(1);
    41 }
    42 /* 初始化服务器地址*/
    43 addrlen=sizeof(struct sockaddr_in);
    44 bzero(&ser_addr,addrlen);
    45 ser_addr.sin_family=AF_INET;
    46 ser_addr.sin_addr.s_addr=inet_addr(seraddr);
    47 ser_addr.sin_port=htons(SERVER_PORT);
    48 if(connect(cli_sockfd,(struct sockaddr*)&ser_addr,&addrlen)!=0)/*请求连接*/
    49 {
    50 /*连接失败 */
    51 fprintf(stderr,"Connect Error:%s\n",strerror(errno));
    52 close(cli_sockfd);
    53 exit(1);
    54 }
    55 strcpy(msg,"hi,I am client!");
    56 send(sockfd,msg,sizeof(msg),0);/*发送数据*/
    57 recv(sockfd,msg,MAX_MSG_SIZE,0); /* 接受数据*/
    58 printf("%s\n",msg);/*在屏幕上打印出来 */
    59 close(cli_sockfd);
    60
    61 return 0;
    62 }

    TCPServer

    /*TCP/IP应用编程接口(API)*/
    /*
    *服务器的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数将其与本机地址以及
    *一个本地端口号绑定,然后调用listen在相应的socket上*,当accpet接收到一个连接服务请求时,
    *将生成一个新的socket。服务器显示该客户机的IP地址,并通过新的socket向客户端发送字符串
    *" hi,I am SERver!"。最后关闭该socket。
    */
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<errno.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>

    int main()
    {
    int sock_fd,client_fd; /*sock_fd:*socket;client_fd:数据传输socket */
    struct sockaddr_in ser_addr; /* 本机地址信息 */
    struct sockaddr_in cli_addr; /* 客户端地址信息 */
    char msg[MAX_MSG_SIZE];/* 缓冲区*/
    ser_sockfd=socket(AF_INET,SOCK_STREAM,0);/*创建连接的SOCKET */
    if(ser_sockfd<0)
    {/*创建失败 */
    fprintf(stderr,"socker Error:%s\n",strerror(errno));
    exit(1);
    }
    /* 初始化服务器地址*/
    addrlen=sizeof(struct sockaddr_in);
    bzero(&ser_addr,addrlen);
    ser_addr.sin_family=AF_INET;
    ser_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    ser_addr.sin_port=htons(SERVER_PORT);
    if(bind(ser_sockfd,(struct sockaddr*)&ser_addr,sizeof(struct sockaddr_in))<0)
    { /*绑定失败 */
    fprintf(stderr,"Bind Error:%s\n",strerror(errno));
    exit(1);
    }
    /*侦听客户端请求*/
    if(listen(ser_sockfd,BACKLOG)<0)
    {
    fprintf(stderr,"Listen Error:%s\n",strerror(errno));
    close(ser_sockfd);
    exit(1);
    }
    while(1)
    {/* 等待接收客户连接请求*/
    cli_sockfd=accept(ser_sockfd,(struct sockaddr*) & cli_addr,&addrlen);
    if(cli_sockfd<=0)
    {
    fprintf(stderr,"Accept Error:%s\n",strerror(errno));
    }
    else
    {/*开始服务*/
    recv(cli_addr,msg,MAX_MSG_SIZE,0); /* 接受数据*/
    printf("received a connection from %sn", inet_ntoa(cli_addr.sin_addr));
    printf("%s\n",msg);/*在屏幕上打印出来 */
    strcpy(msg,"hi,I am server!");
    send(cli_addr,msg,sizeof(msg),0); /*发送的数据*/
    close(cli_addr);
    }
    }
    close(ser_sockfd);
    }




  • 相关阅读:
    Perl 杂记
    Block abstraction view(Create & Reference)
    sed & awk
    multi-voltage design apr
    APR Recipe
    IN2REG group 的时序分析
    关于 clock tree
    ICC Stage Flow
    ocv & derate & crpr
    clock gating check
  • 原文地址:https://www.cnblogs.com/foxmin/p/2389827.html
Copyright © 2011-2022 走看看