tcp_server和tcp_client

来源:互联网 发布:ubuntu 软件包破损 编辑:程序博客网 时间:2024/06/06 02:37

tcp_server代码如下:

#include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<sys/types.h>#include<string.h>static void usage(const char *proc){    printf("Usage: %s [local_ip] [local_port]\n",proc);}int startup(const char *ip,int port){    int sock = socket(AF_INET,SOCK_STREAM, 0);        if(sock < 0){            perror("socket");            exit(2);        }    struct sockaddr_in local;    local.sin_family = AF_INET;    local.sin_port = htons(port);    local.sin_addr.s_addr = inet_addr(ip);    if(bind(sock, (struct sockaddr*)&local, sizeof(local))<0){        perror("bind");        exit(3);    }    if(listen(sock, 10)<0){        perror("listen");        exit(4);    }    return sock;}// ./tcp_server ip portint main(int argc, char *argv[]){    if(argc != 3){        usage(argv[0]);        return 1;    }int listen_sock = startup(argv[1],atoi(argv[2]));while(1){    struct sockaddr_in client;    socklen_t len = sizeof(client);    int new_sock = accept(listen_sock,\            (struct sockaddr*)&client, &len);    if(new_sock < 0){        perror("accept");        continue;    }    printf("get a new cilent, %s:%d\n",\            inet_ntoa(client.sin_addr), ntohs(client.sin_port));    while(1){        char buf[1024];        ssize_t s = read(new_sock, buf, sizeof(buf)-1);        if(s>0){            buf[s] = 0;            printf("client: %s\n", buf);            write(new_sock, buf, strlen(buf));        }else if(s == 0){            close(new_sock);            printf("client quit...\n");            break;        }else{            perror("read");            close(new_sock);            break;        }    }}}****

tcp_client代码如下:

#include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<sys/types.h>#include<string.h>static void usage(const char *proc){    printf("Usage:%s[server_ip][server_port]\n",proc);}//./tcp client server-ip server-portint main(int argc,char *argv[]){    if(argc !=3){    usage(argv[0]);    return 1;    }    int sock = socket(AF_INET,SOCK_STREAM,0);    if(sock<0){    perror("socket");    return 1;    }    struct sockaddr_in server;    server.sin_family = AF_INET;    server.sin_port = htons(atoi(argv[2]));    server.sin_addr.s_addr = inet_addr(argv[1]);    if(connect(sock,(struct sockaddr*)&server,\                sizeof(server))<0){        perror("connect");        return 2;    }    char buf[1024];    while(1){        printf("Please Enter# ");        fflush(stdout);        ssize_t s = read(0,buf,sizeof(buf)-1);        if(s>0){        buf[s-1] = 0;        write(sock, buf, strlen(buf));        s = read(sock, buf, sizeof(buf)-1);        if(s>0){        buf[s] = 0;        printf("server echo# %s\n",buf);        }        }    }}

client终止时自动关闭socket描述符,server的tcp 连接收到client发的FIN段后处于TIME_WITE状态。

原创粉丝点击