多進程 server
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s port\n", argv[0]);
exit(1);
}
int port, server_listen;
port = atoi(argv[1]);
if ((server_listen = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
printf("Socket create.\n");
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
if (bind(server_listen, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("bind");
exit(1);
}
printf("Socket listen.\n");
if (listen(server_listen, 20) < 0) {
perror("server");
exit(1);
}
while (1) {
int sockfd;
printf("Socket before.\n");
if ((sockfd = accept(server_listen, NULL, NULL)) < 0) {
perror("accept");
close(sockfd);
continue;
}
pid_t pid;
if ((pid = fork()) < 0) {
perror("fork");
continue;
}
if (pid == 0) {
close(server_listen);
char name[20] = {0};
if (recv(sockfd, name, sizeof(name), 0) <= 0) {
perror("recv");
close(sockfd);
}
printf("Name = %s\n", name);
exit(0);
}
}
return 0;
}
多線程 server
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
struct Msg {
int server_listen, sockfd;
};
void *recv_data(void *arg) {
struct Msg *tmp;
tmp = (struct Msg *)arg;
char name[512] = {0};
if (recv(tmp->sockfd, name, sizeof(name), 0) <= 0) {
perror("recv");
close(tmp->sockfd);
}
printf("Name = %s\n", name);
pthread_exit(NULL);
}
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s port\n", argv[0]);
exit(1);
}
int port, server_listen;
port = atoi(argv[1]);
if ((server_listen = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
printf("Socket create.\n");
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
if (bind(server_listen, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("bind");
exit(1);
}
printf("Socket listen.\n");
if (listen(server_listen, 20) < 0) {
perror("server");
exit(1);
}
while (1) {
pthread_t thread;
int sockfd;
if ((sockfd = accept(server_listen, NULL, NULL)) < 0) {
perror("accept");
close(sockfd);
continue;
}
struct Msg msg;
msg.sockfd = sockfd;
msg.server_listen = server_listen;
printf("%d %d\n", msg.sockfd, msg.server_listen);
if (pthread_create(&thread, NULL, recv_data, (void *)&msg) != 0) {
perror("pthread create");
break;
}
}
return 0;
}
telnet ip port
string
ctrl + ]
ctrl + d
client
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc, char **argv) {
int sockfd, port;
struct sockaddr_in server;
if (argc != 3) {
fprintf(stderr, "Usage: %s ip port \n", argv[0]);
exit(1);
}
port = atoi(argv[2]);
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr(argv[1]);
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
printf("Socket create. \n");
if (connect(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("connect");
exit(1);
}
if (send(sockfd, "lll", sizeof("llll"), 0) < 0) {
perror("send");
exit(1);
}
close(sockfd);
return 0;
}