别摸我的键盘 的学生作业:
client
#include
#include
#include
#include /* See NOTES */
#include
#include
#include
#include
int main(int argc, const char *argv[])
{
int sockfd,ret;
struct sockaddr_in addr_in;
char buf[] = {"Hello buffer"};
ssize_t sz;
if(argc != 3){
fprintf(stderr, "[ERROR] %s \n", argv[0]);
exit(EXIT_FAILURE);
}
sockfd= socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1){
perror("[ERROR] socket()");
exit(EXIT_FAILURE);
}
//清空 相当于memset()
bzero(&addr_in, sizeof(addr_in));
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(atoi(argv[2]));
addr_in.sin_addr.s_addr = inet_addr(argv[1]);
ret = connect(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in));
if(ret == -1){
perror("[ERROR] connect()");
exit(EXIT_FAILURE);
}
char *sendbuf;
int length;
while(1){
length = strlen(buf);
sendbuf = (char *)malloc(length + 4);
memcpy(sendbuf, &length, 4);
memcpy(sendbuf + 4, buf, length);
sz = send(sockfd, sendbuf, length + 4, 0);
if(sz == -1){
perror("[ERROR] send()");
exit(EXIT_FAILURE);
}
if(strncmp(buf, "quit", 4) == 0){
break;
}
free(sendbuf);
//在 Linux C 编程中,`usleep` 是一个用于微秒级延时的函数
usleep(100);
}
close(sockfd);
return 0;
}
server
#include
#include
#include
#include /* See NOTES */
#include
#include
#include
#include
#define QUEUE_SZ 10
int main(int argc, const char *argv[])
{
int sockfd,ret,csockfd;
struct sockaddr_in addr_in;
char buf[1024];
ssize_t sz;
if(argc != 3){
fprintf(stderr, "[ERROR] %s \n", argv[0]);
exit(EXIT_FAILURE);
}
sockfd= socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1){
perror("[ERROR] socket()");
exit(EXIT_FAILURE);
}
//清空 相当于memset()
bzero(&addr_in, sizeof(addr_in));
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(atoi(argv[2]));
addr_in.sin_addr.s_addr = inet_addr(argv[1]);
ret = bind(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in));
if(ret == -1){
perror("[ERROR] bind()");
exit(EXIT_FAILURE);
}
ret = listen(sockfd, QUEUE_SZ);
if(-1 == ret){
perror("[ERROR] listen()");
exit(EXIT_FAILURE);
}
int len = sizeof(addr_in);
csockfd = accept(sockfd, (struct sockaddr *)&addr_in, &len);
if(-1 == csockfd){
perror("[ERROR] accept()");
exit(EXIT_FAILURE);
}
// printf("client ip is %s\n", inet_ntoa(addr_in.sin_addr));
// printf("client port is %d\n", ntohs(addr_in.sin_port));
int recv_total_sz;
int length;
while(1){
length = 0;
recv_total_sz = 0;
memset(buf, 0, sizeof(buf));
sz = recv(csockfd, &length, 4, 0);
if(-1 == sz){
perror("[ERROR] recv()");
exit(EXIT_FAILURE);
}
while(1){
sz = recv(csockfd, buf + recv_total_sz, length - recv_total_sz, 0);
if(-1 == sz){
perror("[ERROR] recv()");
exit(EXIT_FAILURE);
}else if(sz > 0){
recv_total_sz += sz;
if(recv_total_sz == length){
break;
}
}
}
printf("recv data is --> %s\n", buf);
if(strncmp(buf, "quit", 4) == 0){
printf("server quit!\n");
break;
}
sleep(1);
};
close(csockfd);
close(sockfd);
return 0;
}