描述:有服务端(server)客户端(client)程序,要求实现,服务端从文件中读取文件信息,一次读取10个字节,然后发送到客户端显示,每次读取之后睡眠1秒钟。
server.c:
/*server.c*/ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <unistd.h> #include <netinet/in.h> #include <fcntl.h> #define PORT 4321 #define BUFFER_SIZE 11 #define MAX_QUE_CONN_NM 5 int main() { struct sockaddr_in server_sockaddr, client_sockaddr; int sin_size, recvbytes; int sockfd, client_fd; char buf[BUFFER_SIZE]; int fd,size; /*建立socket连接*/ if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1) { perror("socket"); exit(1); } printf("Socket id = %d\n",sockfd); /*设置sockaddr_in 结构体中相关参数*/ server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(PORT); server_sockaddr.sin_addr.s_addr = INADDR_ANY; bzero(&(server_sockaddr.sin_zero), 8); int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */ setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); /*绑定函数bind*/ if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))== -1) { perror("bind"); exit(1); } printf("Bind success!\n"); /*调用listen函数*/ if (listen(sockfd, MAX_QUE_CONN_NM) == -1) { perror("listen"); exit(1); } printf("Listening....\n"); /*调用accept函数,等待客户端的连接*/ if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1) { perror("accept"); exit(1); } /*调用recv函数接收客户端的请求*/ memset(buf , 0, sizeof(buf)); fd = open("test.txt",O_RDONLY); size = read(fd,buf,10); send(client_fd,buf,BUFFER_SIZE,0); sleep(1); while(size == 10){ size = read(fd,buf,10); buf[10] = '\0'; send(client_fd,buf,BUFFER_SIZE,0); sleep(1); } close(sockfd); exit(0); }
client.c:
/*client.c*/ #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <unistd.h> #include <netdb.h> #include <netinet/in.h> #define PORT 4321 #define BUFFER_SIZE 11 int main(int argc, char *argv[]) { int sockfd, sendbytes; char buf[BUFFER_SIZE]; struct hostent *host; struct sockaddr_in serv_addr; int t; if(argc < 3) { fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n"); exit(1); } /*地址解析函数*/ if ((host = gethostbyname(argv[1])) == NULL) { perror("gethostbyname"); exit(1); } memset(buf, 0, sizeof(buf)); sprintf(buf, "%s", argv[2]); /*创建socket*/ if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) { perror("socket"); exit(1); } /*设置sockaddr_in 结构体中相关参数*/ serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr = *((struct in_addr *)host->h_addr); bzero(&(serv_addr.sin_zero), 8); /*调用connect函数主动发起对服务器端的连接*/ if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr))== -1) { perror("connect"); exit(1); } //不断读取数据 while(recv(sockfd, buf, BUFFER_SIZE, 0) > 0){ printf("%s\n",buf); //加了\n没读取10个字节就显示一次,不加会读完一行显示一次 }//while close(sockfd); exit(0); }Makefile文件:
EXEC1 = server EXEC2 = client OBJS1 = server.o OBJS2 = client.o HEADERS = CC = gcc INC = CFLAGS = ${INC} -g all:${EXEC1} ${EXEC2} ${EXEC1} : ${OBJS1} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS1} ${OBJS1} : ${HEADERS} ${EXEC2} : ${OBJS2} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS2} ${OBJS2} : ${HEADERS} .PHONY : clean clean : -rm -f ${OBJS1} ${EXEC1} -rm -f ${OBJS2} ${EXEC2}
client.c端
不加 \n
server.c端
扫描二维码关注公众号,回复:
1620363 查看本文章