socket并发服务器(frok)

来源:互联网 发布:java 运行环境下载 编辑:程序博客网 时间:2024/05/18 17:44
//服务器#include<stdio.h>#include<stdlib.h>#include<netinet/in.h>//套接字地址结构#include<sys/socket.h>//socket函数#include<strings.h>//字节操纵函数 bzero#include<string.h>#include<unistd.h>void str_echo(int sockfd){    char buffer[100];    int n;    memset(buffer, 0, 100);    while((n = read(sockfd, buffer, 100)) > 0)    {        buffer[n+1] = '\0';        printf("%s\n", buffer);        write(sockfd, buffer, n);        memset(buffer, 0, 100);    }}int main(){    int listenfd, connfd;//监听套接字、已连接的套接字    struct sockaddr_in server_sockaddr, client_sockaddr;    socklen_t clientlen;    pid_t childpid;//子进程号    if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)    {        fprintf(stderr, "Socket failed\n");        exit(EXIT_FAILURE);    }    bzero(&server_sockaddr, sizeof(server_sockaddr));    server_sockaddr.sin_family = AF_INET;    server_sockaddr.sin_port = htons(9877);//端口号,以网络字节序存储    server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);//选择通配地址    if(bind(listenfd, (struct sockaddr*)&server_sockaddr, sizeof(server_sockaddr)) == -1)//绑定本地地址和端口号    {        fprintf(stderr, "Bind failed\n");        exit(EXIT_FAILURE);    }    if(listen(listenfd, 5) == -1)    {        fprintf(stderr, "Listen faliled\n");        exit(EXIT_FAILURE);    }    for( ; ; )    {        clientlen = sizeof(client_sockaddr);        if((connfd = accept(listenfd, (struct sockaddr*)&client_sockaddr, &clientlen)) == -1)        {            fprintf(stderr, "Accept failed\n");            exit(EXIT_FAILURE);        }        if((childpid = fork()) == 0)//创建一个子进程处理客户端的连接        {            close(listenfd);//关闭接听套接字            str_echo(connfd);            close(connfd);            exit(0);//子进程退出        }        close(connfd);    }}
//客户端程序#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<strings.h>#include<string.h>#include<netinet/in.h>#include<sys/socket.h>#include<arpa/inet.h>//地址转换函数void str_cli(int sockfd){    char sendline[100], recvline[100];    int n;    memset(sendline, 0, 100);    memset(recvline, 0, 100);    while(fgets(sendline, 100, stdin) != NULL)    {        write(sockfd, sendline , strlen(sendline));        memset(sendline, 0, 100);        read(sockfd, recvline, 100);        fputs(recvline, stdout);        memset(recvline, 0, 100);    }}int main(int argc, char **argv){    int sockfd;    struct sockaddr_in server_sockaddr;//服务器参数    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)    {        fprintf(stderr, "Socket failed\n");        exit(EXIT_FAILURE);    }    bzero(&server_sockaddr, sizeof(server_sockaddr));//清零    server_sockaddr.sin_family = AF_INET;    server_sockaddr.sin_port = htons(9877);    if(inet_pton(AF_INET, argv[1], &server_sockaddr.sin_addr) == -1)//使用地址转换函数    {        fprintf(stderr, "inet_pton failed\n");        exit(EXIT_FAILURE);    }    if(connect(sockfd, (struct sockaddr*)&server_sockaddr, sizeof(server_sockaddr)) == -1)//连接服务器    {        fprintf(stderr, "Connect failed\n");        exit(EXIT_FAILURE);    }    str_cli(sockfd);    exit(0);}