linux客户端服务器回射程序-编程记录

来源:互联网 发布:淘宝好评返现违规补救 编辑:程序博客网 时间:2024/04/28 16:42
#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<unistd.h>#include<string.h>#include<errno.h>#include<netinet/in.h>#define MAXLINE 4096#define LISTEN_NUM 1024#define SERV_PORT 9877size_t my_write(int sock_fd, const void *vptr, int n) {    size_t left = n;    size_t nwritten = 0;    const char *p = vptr;    while (left > 0) {        if ((nwritten = write(sock_fd, p, left)) <= 0) {            if (n < 0 && errno == EINTR)                nwritten = 0;            else                return -1;        }        left -= nwritten;        p += nwritten;    }    return n;}void str_echo(int sock_fd) {    size_t nread;    size_t nwritten;    char buf[MAXLINE];again:    while ((nread = read(sock_fd, buf, MAXLINE)) > 0) {        nwritten = my_write(sock_fd, buf, nread);        printf("%s", buf);        printf("server write to client:%d\n", nwritten);    }    if (nread < 0 && errno == EINTR)        goto again;    else if (nread < 0) {        printf("error:server read from client failed.\n");    }}int main(int argc, char *argv[]) {    socklen_t len;    pid_t pid;    int listen_fd, client_fd;    struct sockaddr_in server_addr, client_addr;    if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {        printf("error: create listen socket failed.\n");        return -1;    }    bzero(&server_addr, sizeof(server_addr));    server_addr.sin_family = AF_INET;    server_addr.sin_port = htons(SERV_PORT);    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);    bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));    listen(listen_fd, LISTEN_NUM);    while (1) {        len = sizeof(client_addr);        client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len);        if ((pid = fork()) == 0) {            close(listen_fd);            str_echo(client_fd);            exit(0);        }        close(client_fd);    }    return 0;}

客户端:

#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<errno.h>#include<unistd.h>#include<arpa/inet.h>#include<string.h>#include<netinet/in.h>#define MAXLINE 4096#define SERV_PORT 9877size_t my_write(int sock_fd, const void *vptr, size_t n) {    size_t left = n;    size_t nwritten = 0;    const char *p = vptr;    while (left > 0) {        if ((nwritten = write(sock_fd, p, left)) <= 0) {            if (nwritten < 0 && errno == EINTR)                nwritten = 0;            else                return -1;        }        left -= nwritten;        p += nwritten;    }    return n;}static int read_cnt;static char *read_ptr;static char read_buf[MAXLINE];int my_read(int sock_fd, char *c) {    if (read_cnt <= 0) {        again:        if ((read_cnt = read(sock_fd, read_buf, sizeof(read_buf))) < 0) {            if (read_cnt < 0 && errno == EINTR)                goto again;            return -1;        } else if (read_cnt == 0) {            return 0;        }        read_ptr = read_buf;    }    read_cnt--;    *c = *read_ptr++;    return 1;}size_t read_line(int sock_fd, char *buf, size_t max) {    size_t n, rc;    char c;    char *p = buf;    for (n = 1; n < max; n++) {        if ((rc = my_read(sock_fd, &c)) == 1) {            *p++ = c;            if (c == '\n')                break;        } else if (rc == 0) {            *p = '\0';            return n - 1;        } else {            return -1;        }    }    *p = '\0';    return n;}void str_client(FILE *fp, int sock_fd) {    char sendline[MAXLINE];    char recvline[MAXLINE];    size_t n;    while (fgets(sendline, MAXLINE, fp) != NULL) {        n = strlen(sendline);        my_write(sock_fd, sendline, n);        if (read_line(sock_fd, recvline, MAXLINE) == 0) {            printf("error:client read from server failed.\n");        }        fputs(recvline, stdout);    }}int main(int argc, char *argv[]) {    int client_fd;    struct sockaddr_in server_addr;    if (argc != 2) {        printf("error: use <filename>IpAddress.\n");        return -1;    }    client_fd = socket(AF_INET, SOCK_STREAM, 0);    bzero(&server_addr, sizeof(server_addr));    server_addr.sin_family = AF_INET;    server_addr.sin_port = htons(SERV_PORT);    inet_pton(AF_INET, argv[1], &server_addr.sin_addr);    connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));    str_client(stdin, client_fd);    return 0;}