预先分配 - 多进程
#include <cstdio>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT_ID 8800
#define SIZE 100
using namespace std;
int main(void)
{
pid_t pid;
int sockfd, client_sockfd;
struct sockaddr_in my_addr, client_addr;
int addr_len;
char welcome[SIZE] = "Welcome to connect to the sever!";
sockfd = socket(AF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT_ID);
my_addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
listen(sockfd, 10);
addr_len = sizeof(struct sockaddr);
for (int i=0;i<4;i++)
{
fork();
}
while(1)
{
printf("Server is waiting for client to connect:\n");
client_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t*)&addr_len);
printf("Client IP address = %s\n", inet_ntoa(client_addr.sin_addr));
send(client_sockfd, welcome, SIZE, 0);
printf("Disconnect the client request.\n");
close(client_sockfd);
}
close(sockfd);
return 0;
}
#include <cstdio>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstdlib>
#define PORT_ID 8800
#define SIZE 100
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in server_addr;
char buf[SIZE];
if(argc < 2)
{
printf("Usage: ./client [server IP address]\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT_ID);
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
recv(sockfd, buf, SIZE, 0);
printf("Client receive from server: %s\n", buf);
close(sockfd);
return 0;
}
实时分配 - 多线程
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#define PORT_ID 8800
#define SIZE 100
void *thread_function(void *arg);
struct sockaddr_in client_addr;
int client_sockfd;
char welcome[SIZE] = "Welcome to connect to the sever!";
int main(void)
{
int sockfd;
struct sockaddr_in my_addr;
int addr_len;
pthread_t pthread;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT_ID);
my_addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
listen(sockfd, 10);
addr_len = sizeof(struct sockaddr);
while(1)
{
printf("Server is waiting for client to connect:\n");
client_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &addr_len);
pthread_create(&pthread, NULL, thread_function, NULL);
}
close(sockfd);
return 0;
}
void *thread_function(void *arg)
{
printf("Client IP address = %s\n", inet_ntoa(client_addr.sin_addr));
send(client_sockfd, welcome, SIZE, 0);
printf("Disconnect the client request.\n");
close(client_sockfd);
pthread_exit(NULL);
return NULL;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#define PORT_ID 8800
#define SIZE 100
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in server_addr;
char buf[SIZE];
if(argc < 2)
{
printf("Usage: ./client [server IP address]\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT_ID);
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
recv(sockfd, buf, SIZE, 0);
printf("Client receive from server: %s\n", buf);
close(sockfd);
return 0;
}