慕神4583458 的学生作业:
server.c
#include /* See NOTES */
#include
#include
#include
#include
#include
#include
#include
#include
#define BACKLOG 100
int main(int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr, " %s ip port", argv[0]);
exit(EXIT_FAILURE);
}
int socketfd = socket(AF_INET, SOCK_STREAM, 0);
if (socketfd == -1) {
perror("socket():");
exit(EXIT_FAILURE);
}
struct sockaddr_in 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]);
int ret = bind(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in));
if (ret == -1) {
fprintf(stderr, "Bind error\n");
}
ret = listen(socketfd, BACKLOG);
if (ret == -1) {
perror("listen():");
exit(EXIT_FAILURE);
}
struct sockaddr_in recvaddr_in;
socklen_t len;
int newsocketfd = accept(socketfd, (void *)&recvaddr_in, &len);
if (ret == -1) {
perror("accpet():");
exit(EXIT_FAILURE);
}
printf("source ip = %s port = %d\n", inet_ntoa(recvaddr_in.sin_addr), ntohs(recvaddr_in.sin_port));
char read_buf[1024];
ssize_t rsize;
ssize_t wsize;
while(1) {
memset(read_buf, 0, sizeof(read_buf));
rsize = recv(newsocketfd, read_buf, sizeof(read_buf), 0);
if (rsize < 0) {
perror("recv():");
} else if (rsize > 0) {
if (strcmp(read_buf, "quit") == 0) {
printf("quit exit\n");
break;
}
printf("recv=%s\n", read_buf);
wsize = send(newsocketfd, read_buf, strlen(read_buf), 0);
if (wsize == -1) {
perror("send():");
}
} else if (rsize == 0) {
printf("client exit\n");
break;
}
}
close(socketfd);
close(newsocketfd);
return 0;
}
client.c
#include /* See NOTES */
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr, " %s ip port", argv[0]);
exit(EXIT_FAILURE);
}
int socketfd = socket(AF_INET, SOCK_STREAM, 0);
if (socketfd == -1) {
perror("socket():");
exit(EXIT_FAILURE);
}
struct sockaddr_in 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]);
int ret = connect(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in));
if (ret == -1) {
perror("connet():");
close(socketfd);
return -1;
}
pid_t pid = fork();
if (pid == 0) {
char read_buf[1024];
ssize_t rsize;
while(1) {
bzero(read_buf,sizeof(read_buf));
rsize = recv(socketfd, read_buf, sizeof(read_buf), 0);
if (rsize == -1) {
perror("recv():");
break;
} else if (rsize == 0) {
break;
}
printf("%s\n", read_buf);
}
close(socketfd);
exit(EXIT_FAILURE);
}
char buf[1024];
ssize_t sz;
while(1) {
bzero(buf, sizeof(buf));
putchar('>');
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
if (strcmp(buf, "quit") == 0) break;
sz = send(socketfd, buf, strlen(buf), 0);
}
close(socketfd);
wait(NULL);
return 0;
}