From 2e153efab43452d568884212a9fe09be66265c62 Mon Sep 17 00:00:00 2001 From: riba2534 Date: Sat, 26 Jan 2019 15:39:25 +0800 Subject: [PATCH] =?UTF-8?q?13.2=20readv=20&=20writev=20=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch13/peek_recv.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ ch13/peek_send.c | 37 +++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 ch13/peek_recv.c create mode 100644 ch13/peek_send.c diff --git a/ch13/peek_recv.c b/ch13/peek_recv.c new file mode 100644 index 0000000..b13893d --- /dev/null +++ b/ch13/peek_recv.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include + +#define BUF_SIZE 30 +void error_handling(char *message); + +int main(int argc, char *argv[]) +{ + int acpt_sock, recv_sock; + struct sockaddr_in acpt_adr, recv_adr; + int str_len, state; + socklen_t recv_adr_sz; + char buf[BUF_SIZE]; + if (argc != 2) + { + printf("Usage : %s \n", argv[0]); + exit(1); + } + acpt_sock = socket(PF_INET, SOCK_STREAM, 0); + memset(&acpt_adr, 0, sizeof(acpt_adr)); + acpt_adr.sin_family = AF_INET; + acpt_adr.sin_addr.s_addr = htonl(INADDR_ANY); + acpt_adr.sin_port = htons(atoi(argv[1])); + + if (bind(acpt_sock, (struct sockaddr *)&acpt_adr, sizeof(acpt_adr)) == -1) + error_handling("bind() error"); + listen(acpt_sock, 5); + + recv_adr_sz = sizeof(recv_adr); + recv_sock = accept(acpt_sock, (struct sockaddr *)&recv_adr, &recv_adr_sz); + + while (1) + { + //保证就算不存在待读取数据也不会阻塞 + str_len = recv(recv_sock, buf, sizeof(buf) - 1, MSG_PEEK | MSG_DONTWAIT); + if (str_len > 0) + break; + } + + buf[str_len] = 0; + printf("Buffering %d bytes : %s \n", str_len, buf); + //再次调用 recv 函数,这一次没有设置任何可选项,所以可以直接从缓冲区读出 + str_len = recv(recv_sock, buf, sizeof(buf) - 1, 0); + buf[str_len] = 0; + printf("Read again: %s \n", buf); + close(acpt_sock); + close(recv_sock); + return 0; +} + +void error_handling(char *message) +{ + fputs(message, stderr); + fputc('\n', stderr); + exit(1); +} \ No newline at end of file diff --git a/ch13/peek_send.c b/ch13/peek_send.c new file mode 100644 index 0000000..e64709e --- /dev/null +++ b/ch13/peek_send.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include +#include +void error_handling(char *message); + +int main(int argc, char *argv[]) +{ + int sock; + struct sockaddr_in send_adr; + if (argc != 3) + { + printf("Usage : %s \n", argv[0]); + exit(1); + } + sock = socket(PF_INET, SOCK_STREAM, 0); + memset(&send_adr, 0, sizeof(send_adr)); + send_adr.sin_family = AF_INET; + send_adr.sin_addr.s_addr = inet_addr(argv[1]); + send_adr.sin_port = htons(atoi(argv[2])); + + if (connect(sock, (struct sockaddr *)&send_adr, sizeof(send_adr)) == -1) + error_handling("connect() error"); + + write(sock, "123", strlen("123")); + close(sock); + return 0; +} + +void error_handling(char *message) +{ + fputs(message, stderr); + fputc('\n', stderr); + exit(1); +} \ No newline at end of file