完全简化,没有检查各函数返回值
客户端:
#include <time.h> /* old system? */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <errno.h>
#include <fcntl.h> /* for nonblocking */
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h> /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h>
int
main(int argc, char **argv) {
int sockfd, n;
char recvline[4096 + 1];
struct sockaddr_in servaddr;
if (argc != 2)
;
//err_quit("usage: a.out <IPaddress>");//作者自定义的退出函数,这里为求简化注释掉了,用分号代替
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
;
//err_sys("socket error");
bzero(&servaddr, sizeof (servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5000); /* daytime server */ //13
if (inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr) <= 0)
//if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)//终端运行时以命令行第二个参数作为ip地址
;
//err_quit("inet_pton error for %s", argv[1]);
if (connect(sockfd, (sockaddr *) & servaddr, sizeof (servaddr)) < 0)
;
//err_sys("connect error");
/*
* 执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;
* 标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。
*/
while ((n = read(sockfd, recvline, 4096)) > 0) {
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)//stdout(Standardoutput)标准输出,指屏幕; EOF表示输出失败
;
//err_sys("fputs error");
}
if (n < 0)
;
//err_sys("read error");
exit(0);
}
服务器:
//#include "unp.h"
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <errno.h>
#include <fcntl.h> /* for nonblocking */
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h> /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h>
#include <time.h>
int
main(int argc, char **argv) {
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[4096];
time_t ticks;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof (servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(5000); /* daytime server */ //13,书上用着13端口,需要在root权限下运行服务器
bind(listenfd, (sockaddr *) & servaddr, sizeof (servaddr));
listen(listenfd, 1024);
for ( ; ; ) {
connfd = accept(listenfd, (sockaddr *) NULL, NULL);
ticks = time(NULL);
snprintf(buff, sizeof (buff), "%.24s %s\r\n", ctime(&ticks),"中国");
write(connfd, buff, strlen(buff));
close(connfd);
}
}
输出:
Fri Sep 7 11:35:30 2018 中国