效果
s.c
root@TTT:~# cat s.c #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <assert.h> int main(int argc, char *argv[]) { int fd = -1; int ret = -1; int opt = 1; struct sockaddr_in addr; struct sockaddr_in client; socklen_t len = 0; pid_t pid = -1; addr.sin_family = AF_INET; addr.sin_port = htons(7000); addr.sin_addr.s_addr = inet_addr("0.0.0.0"); client.sin_family = AF_INET; client.sin_port = htons(7001); client.sin_addr.s_addr = inet_addr(argv[1]); pid = fork(); if (pid == -1) { perror("fork:"); } else if (pid > 0) { fd = socket(AF_INET, SOCK_STREAM, 0); setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); printf("Server# set server IP %s Port %d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr)); assert(ret == 0); ret = listen(fd, 6); assert(ret == 0); printf("Server# start accept\n"); len = sizeof(client); ret = accept(fd, (struct sockaddr *)&client, &len); printf("Server# accept IP %s Port %d connected\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); close(ret); close(fd); } else { usleep(20000); fd = socket(AF_INET, SOCK_STREAM, 0); setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); assert(fd != -1); printf("Client# set client IP %s Port %d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); ret = bind(fd, (struct sockaddr *)&client, sizeof(client)); assert(ret == 0); printf("Client# connect to IP %s Port %d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr)); close(fd); } usleep(2000); return 0; }
