传统的网络编程(分三步一步一步的写)

server
#include <sys/types.h>
#include <sys/socket.h>
#include <ctype.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

#define MAX_READ_MSG_LEN    4096
#define MAX_WRITE_MSG_LEN   4096 

const   short       g_nConnectPort = 15623;
const char* g_szUserMsg="Hi,I'm server!";

typedef struct sockaddr SA;
typedef struct sockaddr_in SA4;

void do_work(int fd) 
{
#if 1
    int r,i;
    char buf[MAX_READ_MSG_LEN];
    //读取数据
    r = read(fd,buf,MAX_READ_MSG_LEN);
    //处理数据
    write(1, buf, r);
    //响应客户端
    write(fd, g_szUserMsg, MAX_WRITE_MSG_LEN);
#endif
    return;
}

int main() 
{
    int s_fd;
    int c_fd;
    SA4 addr, cli;
    //char ip[128];
    pid_t pid;

    //创建socket
    s_fd = socket(AF_INET,SOCK_STREAM,0);
    if(s_fd == -1) 
    {
        perror("socket");
        return -1;
    }

    //初始化ipv4地址
    addr.sin_family = AF_INET;
    //初始化需要将端口号将主机字节序转换为网络字节序
    addr.sin_port = htons(g_nConnectPort);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    //将s_fd和addr地址空间绑定
    int b = bind(s_fd, (SA*)&addr, sizeof(addr));
    if(b == -1) 
    {
        perror("bind");
        return -1;
    }

    //将s_fd设置为被动监听
    listen(s_fd, 5);//5是最多可以存放5个链接

    //从未决链接队列里取出一个链接
    while(1) 
    {
        int cli_len = sizeof(cli);

        c_fd = accept(s_fd, (SA*)&cli, &cli_len);
        if(c_fd == -1) 
        {
            perror("accept");
            return -1;
        }

        //printf("%s\n",inet_ntop(AF_INET,&cli.sin_addr,ip,128));

        //创建子进程
        pid = fork();
        if(pid == -1) 
        {
            perror("fork");
            return -1;
        }
        if(pid == 0) 
        {
            close(s_fd);
            //业务处理
            while(1)
            {
                do_work(c_fd);
            }

            //关闭本次链接,结束本次通讯
            close(c_fd);
            exit(0);
        }else 
        {
            close(c_fd);
            waitpid(-1, NULL,WNOWAIT);
        }
    }
    close(s_fd);
    return 0;
}
client
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ctype.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

typedef struct sockaddr SA;
typedef struct sockaddr_in SA4;
int main(int argc, char *argv[]) {

    SA4 serv;
    char *msg = "lao wang\n";
    char buf[128];
    int r;
    //创建一个用于通信的设备
    int s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if(s_fd == -1) {
        perror("socket");
        return -1;
    }
    //初始化服务器的ip地址和端口号
    serv.sin_family = AF_INET;
    serv.sin_port = htons(15623);
    //ip地址127.0.0.1,这里的ip从终端输入
    inet_pton(AF_INET,argv[1],&serv.sin_addr);
    //将s_fd链接到服务器的地址
    int c = connect(s_fd, (SA*) &serv, sizeof(serv));
    if(c == -1) {
        perror("connect");
        return -1;
    }
    //向服务器发送消息
    write(s_fd,msg,strlen(msg));
    //阻塞等待服务器的响应消息
    r = read(s_fd, buf, 128);
    //处理响应消息
    write(1, buf, r);
    //告知服务器结束本次通话
    close(s_fd);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_38239856/article/details/81903654