c語言 socket 多進程 多線程

多進程 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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章