zoukankan      html  css  js  c++  java
  • linux下TCP连接的client和server 【转载】

    linux下TCP连接的client和server

    http://blog.163.com/caipeipei_love@126/blog/static/2596603220101118433940/

    基于TCP连接的client和server简单通信

    我在看电子书,班主任来了说动手写个client和server的简单通信,只看是不行的,写好了给我看看,真的是一语点中了真理啊:只看不动手,什么时候都不会掌握的!

    下午自己就动手写了一个:

    主要是基于TCP的三次握手的,面向连接的client和server

    tcpserver.c

    复制代码
    #include<stdlib.h>
    #include<stdio.h>
    #include<errno.h>
    #include<string.h>
    #include<netdb.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    #include<sys/socket.h>
    #include<unistd.h>
    #include<arpa/inet.h>
    #define portnumber 8080
    int main(int argc ,char *argv[])
    {
        int sockfd,new_fd;
        struct sockaddr_in server_addr;
        struct sockaddr_in client_addr;
        int sin_size,iDataNum;
    //    const char hello[]="Hello cpp, you are success.
    ";
        char buffer[4096];
    
    </span><span style="color: #0000ff;">if</span>(argc!=<span style="color: #800080;">2</span><span style="color: #000000;">)
    {
         fprintf(stderr,</span><span style="color: #800000;">"</span><span style="color: #800000;">Usage:%s portnumbera
    </span><span style="color: #800000;">"</span>,argv[<span style="color: #800080;">0</span><span style="color: #000000;">]);
         </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
    }
    

    // if((portnumber=atoi(argv[1]))<0)
    // {
    // fprintf(stderr,"Usage:%s portnumbera ",argv[0]);
    // return 0;
    // }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))-1)
    {
    fprintf(stderr,
    "Socket error:%s a",strerror(errno));
    return 0;
    }
    bzero(
    &server_addr,sizeof(struct sockaddr_in));
    server_addr.sin_family
    =AF_INET;
    server_addr.sin_addr.s_addr
    =htonl(INADDR_ANY);
    server_addr.sin_port
    =htons(portnumber);
    if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))
    -1)
    {
    fprintf(stderr,
    "Bind error:%s a",strerror(errno));
    return 0;
    }
    if(listen(sockfd,5)-1)
    {
    fprintf(stderr,
    "Listen error:%s a",strerror(errno));
    return 0;
    }
    while(1)
    {
    sin_size
    =sizeof(struct sockaddr_in);
    if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))
    -1)
    {
    fprintf(stderr,
    "Accept error:%s a",strerror(errno));
    return 0;
    }
    fprintf(stdout,
    "Server get connection from %s ",inet_ntoa(client_addr.sin_addr));
    iDataNum
    =recv(new_fd,buffer,4096,0);
    if(iDataNum<0)
    {
    perror(
    "Recv ");
    exit(
    1);
    }
    printf(
    "Recv data is %s ",buffer);
    send(new_fd,buffer,
    sizeof(buffer),0);
    // if(write(new_fd,hello,strlen(hello))==-1)
    // {
    // fprintf(stderr,"write error:%s ",strerror(errno));
    // return 0;
    // }
    close(new_fd);

    }
    close(sockfd);
    

    // exit(0);
    return 0;
    }

    复制代码

    client.c

    复制代码
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<netdb.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    #include<sys/socket.h>
    #include<unistd.h>
    #include<arpa/inet.h>
    #include<errno.h>
    

    int main(int argc,char *argv[])
    {
    int sockfd;
    char sendbuffer[200];
    char recvbuffer[200];
    // char buffer[1024];
    struct sockaddr_in server_addr;
    struct hostent host;
    int portnumber,nbytes;
    if(argc!=3)
    {
    fprintf(stderr,
    "Usage :%s hostname portnumbera ",argv[0]);
    exit(
    1);
    }
    if((host=gethostbyname(argv[1]))NULL)
    {
    herror(
    "Get host name error ");
    exit(
    1);
    }
    if((portnumber=atoi(argv[2]))<0)
    {
    fprintf(stderr,
    "Usage:%s hostname portnumbera ",argv[0]);
    exit(
    1);
    }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))
    -1)
    {
    fprintf(stderr,
    "Socket Error:%sa ",strerror(errno));
    exit(
    1);
    }
    bzero(
    &server_addr,sizeof(server_addr));
    server_addr.sin_family
    =AF_INET;
    server_addr.sin_port
    =htons(portnumber);
    server_addr.sin_addr
    =
    ((struct in_addr *)host->h_addr);
    if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))-1)
    {
    fprintf(stderr,
    "Connect error:%s ",strerror(errno));
    exit(
    1);
    }
    while(1)
    {
    printf(
    "Please input your word: ");
    scanf(
    "%s",sendbuffer);
    printf(
    " ");
    if(strcmp(sendbuffer,"quit")
    0)
    break;
    send(sockfd,sendbuffer,
    sizeof(sendbuffer),0);
    recv(sockfd,recvbuffer,
    200,0);
    printf(
    "recv data of my world is :%s ",recvbuffer);
    }
    // if((nbytes=read(sockfd,buffer,1024))==-1)
    //{
    // fprintf(stderr,"read error:%s ",strerror(errno));
    // exit(1);
    // }
    // buffer[nbytes]='';
    // printf("I have received %s ",buffer);
    close(sockfd);
    exit(
    0);
    }

    复制代码

    首先要编译tcpserver.c,命令:gcc -g tcpserver.c -o tcpserver

     运行:./tcpserver 8080

    然后再编译tcpclient.c,具体命令:gcc -g tcpclient.c -o tcpclient

    运行:./tcpclient localhost 8080

  • 相关阅读:
    LIST组件使用总结
    openlayers之interaction(地图交互功能)
    vbind:class绑定样式,决定样式的显示与否
    cesium之measure功能实现
    Cesium渲染效果差,锯齿明显,解决办法
    CSS让DIV层叠 两个DIV或多个DIV顺序重叠加
    ES6之import/export命令
    vantui:
    Openlayers简单要素的添加
    Vue中的this表示?
  • 原文地址:https://www.cnblogs.com/xjyxp/p/11145794.html
Copyright © 2011-2022 走看看