Skip to content

Commit

Permalink
IO分离的其他说明(shutdown使用)
Browse files Browse the repository at this point in the history
  • Loading branch information
chankeh committed Aug 4, 2017
1 parent d354ecd commit 53edba5
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 0 deletions.
Binary file added ch16/IO分离的其他说明.docx
Binary file not shown.
45 changes: 45 additions & 0 deletions ch16/client.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024

int main(int argc, char * argv[]){
int sock;
FILE *readfp;
FILE *writefp;
struct sockaddr_in serv_adr;
socklen_t clnt_adr_sz;
char buf[BUF_SIZE];

sock = socket(PF_INET,SOCK_STREAM,0);

memset(&serv_adr,0,sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = inet_addr(argv[1]);
serv_adr.sin_port = htons(atoi(argv[2]));

connect(sock,(struct sockaddr *)&serv_adr,sizeof(serv_adr));

readfp = fdopen(sock,"r");
writefp = fdopen(sock,"w");

while(1){
if(fgets(buf,sizeof(buf),readfp) == NULL){
break;
}

fputs(buf,stdout);
fflush(stdout);
}

fputs("from client: thank you\n",writefp);
fflush(writefp);
fclose(readfp);
fclose(writefp);

return 0;
}
48 changes: 48 additions & 0 deletions ch16/server.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024

int main(int argc, char * argv[]){
int serv_sock,clnt_sock;
FILE *readfp;
FILE *writefp;
struct sockaddr_in serv_adr,clnt_adr;
socklen_t clnt_adr_sz;
char buf[BUF_SIZE];

serv_sock = socket(PF_INET,SOCK_STREAM,0);

memset(&serv_adr,0,sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_adr.sin_port = htons(atoi(argv[1]));

bind(serv_sock,(struct sockaddr *)&serv_adr,sizeof(serv_adr));

listen(serv_sock,5);

clnt_adr_sz = sizeof(clnt_adr);

clnt_sock = accept(serv_sock,(struct sockaddr *)&clnt_adr,&clnt_adr_sz);

readfp = fdopen(clnt_sock,"r");
writefp = fdopen(dup(clnt_sock),"w");

fputs("from server: Hi~ client? \n",writefp);
fputs("I love all the world! \n",writefp);
fflush(writefp);

shutdown(fileno(writefp),SHUT_WR);

fclose(writefp);
fgets(buf,sizeof(buf),readfp);
fputs(buf,stdout);

fclose(readfp);

return 0;
}

0 comments on commit 53edba5

Please sign in to comment.