tcp程序——回声客户端

来源:互联网 发布:财经日历数据哪个靠谱 编辑:程序博客网 时间:2024/04/30 19:01

服务器端

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/socket.h>#define BUF_SIZE 1024void error_handling(char *message);int main(int argc, char *argv[]){    int serv_sock;    int clnt_sock;    struct sockaddr_in serv_addr;    struct sockaddr_in clnt_addr;    socklen_t clnt_addr_size;    int str_len;    char message[BUF_SIZE];    if(argc!=2){        printf("Usage: %s <port>\n", argv[0]);        exit(1);    }    puts("socket()...");    serv_sock = socket(PF_INET, SOCK_STREAM, 0);    if(serv_sock==-1)        error_handling("socket() error");    memset(&serv_addr, 0, sizeof(serv_addr));    serv_addr.sin_family = AF_INET;    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);    serv_addr.sin_port = htons(atoi(argv[1]));    puts("bind()...");    if(bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)        error_handling("bind() error");    puts("listen()...");    if(listen(serv_sock, 5)==-1)        error_handling("listen() error");    //同一个时刻只能连接一个客户端    while(1){        //连接客户端        puts("wait accept()...");        clnt_addr_size = sizeof(clnt_addr);        clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);        if(clnt_sock==-1)            error_handling("accept() error");        else            puts("accepted");        //从客户端读取信息,并返回给客户端        while((str_len=read(clnt_sock,message,BUF_SIZE))!=0){            puts("read() and write() message");            write(clnt_sock, message, str_len);        }        //关闭客户端        close(clnt_sock);        puts("closed");    }    close(serv_sock);    return 0;}void error_handling(char *message){    fputs(message, stderr);    fputc('\n',stderr);    perror("[error]");    exit(1);}

客户端

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/socket.h>#define BUF_SIZE 1024void error_handling(char *message);int main(int argc, char *argv[]){    int sock;    struct sockaddr_in serv_addr;    char message[BUF_SIZE];    int str_len;    if(argc!=3){        printf("Usage: %s <host> <port>\n",argv[0]);        exit(1);    }    puts("socket()...");    sock = socket(PF_INET, SOCK_STREAM, 0);    if(sock==-1)        error_handling("socket() error");    memset(&serv_addr, 0, sizeof(serv_addr));    serv_addr.sin_family = AF_INET;    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);    serv_addr.sin_port = htons(atoi(argv[2]));    puts("connect()...");    if(connect(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1)        error_handling("bind() error");    else        puts("connected...");    while(1){        fputs("Input message(Q to quit): ",stdout);        fgets(message, BUF_SIZE, stdin);        if(strcmp(message,"q\n")==0 || strcmp(message,"Q\n")==0)            break;        puts("write() and read() message");        write(sock,message,strlen(message));        str_len = read(sock, message, BUF_SIZE-1);        if(str_len==-1)            error_handling("read() error");        message[str_len] = 0;        printf("Message from server: %s\n",message);    }    close(sock);    return 0;}void error_handling(char *message){    fputs(message, stderr);    fputc('\n',stderr);    exit(1);}

运行

./server 54321

./client 127.0.0.1 54321

参考

  • TCP/IP网络编程,尹圣雨
0 0