【断更一段时间】CSAPP-LAB-SOCKET
CSAPP-LAB-SOCKET
0x00 代码
server.c
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include "rio.h"
int main(){
struct sockaddr_in my_sock;
memset(&my_sock,0,sizeof(my_sock));
my_sock.sin_addr.s_addr=inet_addr("127.0.0.1");
my_sock.sin_family=AF_INET;
my_sock.sin_port=htons((unsigned short)7778);
int fd=socket(AF_INET,SOCK_STREAM,0);
if(fd<0){
printf("socket error\n");
return -1;
}
int ret=bind(fd,(struct sockaddr*)(&my_sock),sizeof(struct sockaddr));
if(ret<0){
printf("bind error\n");
return -1;
}
ret=listen(fd,1024);
if(ret<0){
printf("listen error\n");
return -1;
}
socklen_t ret_size=sizeof(struct sockaddr);
memset(&my_sock,0,sizeof(struct sockaddr));
fd=accept(fd,(struct sockaddr*)(&my_sock),&ret_size);//我吐了,这个地方虽然传入的是指针,但是引用值
//还是要有初值,为sizeof(struct sockaddr)
if(fd<0){
printf("connected error\n");
return -1;
}
printf("client addr:%s\nport:%u",inet_ntoa(my_sock.sin_addr),(unsigned int)ntohs(my_sock.sin_port));
rio_t rp;
rio_init(fd,&rp);
char read_buf[MAX_RIO_BUF_SIZE];
while(1){
rio_readLineb(&rp,read_buf,MAX_RIO_BUF_SIZE);
printf("%s",read_buf);
}
close(fd);
return 0;
}
client.c
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include "rio.h"
int main(){
struct sockaddr_in my_sock;
memset(&my_sock,0,sizeof(my_sock));
my_sock.sin_addr.s_addr=inet_addr("127.0.0.1");
my_sock.sin_family=AF_INET;
my_sock.sin_port=htons(7778);
int fd=socket(AF_INET,SOCK_STREAM,0);
if(fd<0){
printf("socket error\n");
return -1;
}
int ret=connect(fd,(struct sockaddr*)(&my_sock),sizeof(my_sock));
if(ret<0){
printf("connect error\n");
return -1;
}
rio_t rp;
rio_init(STDIN_FILENO,&rp);
char write_buf[MAX_RIO_BUF_SIZE];
while(1){
rio_readLineb(&rp,write_buf,MAX_RIO_BUF_SIZE);
rio_writen(fd,write_buf,strlen(write_buf));//这个地方写入的大小是strlen(write_buf)字节大小
} //而不是sizeof(write_buf) 这是一个指针的大小
close(fd);
return 0;
}
编译命令 gcc server.c ./rio.so -o server
gcc client.c ./rio.so -o client
rio.so是上一个实验编译的共享库