unix环境IPC通信之socket(三),tcp采用并发服务器编程实例,多进程方式

/*************************************************************

*                                                                           *

* tcp_server.c           *

*                                                                      *

**************************************************************/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
 
 
#define portnum 3333
 
 
int main(void)
{
    int sockfd;
    int new_fd;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    char buffer[128];
    int nbyte;
    int sin_size;
    pid_t pid;
 
 
    /* 1.创建套接字 */
    sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if(sockfd == -1)
    {
        printf("create socket error !\n");
        exit(1);
    }
    /* 2.1设定要绑定的地址 */
    bzero(&server_addr,sizeof(struct sockaddr_in));    // 清零
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons((uint16_t)portnum);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 
 
    /* 2.2绑定地址 */
    if( bind(sockfd, (struct sockaddr *)&server_addr,sizeof(struct sockaddr)) == -1 )
    {
        printf("bin addr error !\n");
    }
 
 
 
 
    /* 3.监听端口 */
    listen(sockfd, 5);
 
 
    while(1)
    {
        sin_size = sizeof(struct sockaddr);
        /* 4.等待连接 */
        new_fd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t *)&sin_size);
 
 
        printf("server get connection from %s\n", inet_ntoa(client_addr.sin_addr));
 
 
        /* 创建子进程 */
        pid = fork();
 
 
        if(pid == 0){
            /* 5.接收数据 */
            nbyte = recv(new_fd, (void *)buffer, 128, 0);
            buffer[nbyte] = '\0';
            printf("server received : %s\n", buffer);
 
 
            /* 6.结束连接 */
            close(new_fd);
            close(sockfd);
            exit(0);
        }
        else if(pid < 0)
        {
            printf("error !\n");
        }
    }
 
 
    close(sockfd);
 
 
    return 0;
}
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 

/*************************************************************

*                                                           *

* tcp_clien.c      *

*                                                            *

**************************************************************/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>
 
 
#define portnum 3333
 
 
int main()
{
    int sockfd;
    struct sockaddr_in server_addr;
    char buffer[128];
 
 
    /* 1.创建套接字 */
    sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if(sockfd == -1)
    {
        printf("create socket error !\n");
        exit(1);
    }
 
 
    /* 2.1 设置要链接的服务器的地址 */
    bzero(&server_addr,sizeof(struct sockaddr_in));    // 清零
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons((uint16_t)portnum);
    server_addr.sin_addr.s_addr = inet_addr("192.168.93.125");
 
 
    /* 2.2 连接服务器 */
    if(connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
    {
        printf("connet error!\n");
        exit(1);
    }
 
 
    /* 3. 发送数据 */
    printf("Please input char : \n");
    fgets(buffer,128,stdin);
    send(sockfd,buffer,strlen(buffer),0);
 
 
    /* 4. 关闭套接字 */
    close(sockfd);
 
 
    return 0;
}
 
 
特别提醒:关于tcp_client.c中的ip:192.168.93.125,因为我在同一台主机上面运行(该ip为我主机的ip),
	  所以就直接定死,如果需要在不同机子上运行可以通过传参数的方式。因为服务器地址只有一个,
	  所以两边的服务器地址设定方式就要一样。


 
 

猜你喜欢

转载自blog.csdn.net/perfect1t/article/details/78113512