1. 客户端的代码比服务端简单一些:
#include <netdb.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
if(argc < 3){
printf("usage: %s ip port\n", argv[0]);
exit(1);
}
/*step 1 creat socket*/
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0){
perror("socket error");
exit(1);
}
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));//argv[1]=ip_addr
/*host(192...) to net (server's ip address from terminal), then add in serveraddr */
inet_pton(AF_INET, argv[1], &serveraddr.sin_addr.s_addr);
/*step 2 connect()*/
if(connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0){
perror("connect error");
exit(1);
}
/*step 3 IO function: read/write*/
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
size_t size;
if((size = read(sockfd, buffer, sizeof(buffer))) < 0){
perror("read error");
}
if(write(STDOUT_FILENO, buffer, size) != size){
perror("write error");
}
/*step 6 close socket*/
close(sockfd);
return 0;
}
2. 注意添加头文件#include <unistd.h>
这个头文件中的接口,定义了linux/unix的系统调用,如read/write/getpid等
STDOUT_FILENO是标准输出,STDIN_FILENO是标准输入,STDERR_FILENO是标准出错,它们是文件描述符,是int类型(一般为0 1 2),是没有buffer的IO,在write、read、open、close函数中直接进行系统调用;
而stdin、stdout、stderr标准IO描述字是FILE *类型,定义在<stdio.h>中,用在fwrite、fread、fopen、fclose函数。
3. 与服务器进行连接
客户端接收到了服务端返回的系统时间
服务端可以看到连接上的客户端信息(addr port),这个端口是系统分配的