socket基本tcp流程源码

服务端

复制代码
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>

#define PORT 9487            //服务器端口

#define BUFFER_SIZE 4096
#define LISTEN_NUM 5

int init_server_socket(int *fd, int port)
{
    struct sockaddr_in servaddr;

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(port);
    servaddr.sin_addr.s_addr=INADDR_ANY;

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

    int on = 1; 
    setsockopt(*fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

    if(bind(*fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        perror("bind error");
        return -1;
    }

    if(listen(*fd, LISTEN_NUM) < 0)
    {
        perror("listen error:");
        return -1;
    }

    printf("create fd at :%d, listen on %d\n", *fd, port);
    return 0;
}

int test_socket_io(int *fd)
{
    char send_buf[BUFFER_SIZE], recv_buf[BUFFER_SIZE];
    memset(send_buf, 0, sizeof(send_buf));
    strcat(send_buf, "hello client\n");

    if(send(*fd, send_buf, strlen(send_buf), 0) < 0)
    {
        perror("send: ");    
        return -1;
    }
    else
    {
        printf("send buf successful\n");
    }
    
    memset(recv_buf, 0, sizeof(recv_buf));
    recv(*fd, recv_buf, sizeof(recv_buf) - 1, 0);
    printf("\n%s\n", recv_buf);
}

int close_socket(int *fd)
{
    if(*fd != -1)
    {
        close(*fd);
        *fd = -1;
    }
    return 0;
}

int main(int argc, char*argv[])
{
    int port;
    int server_sockfd, client_sockfd;
    struct sockaddr_in clientaddr;
    int sin_size = sizeof(struct sockaddr_in);

    if(argv[1] != NULL)
    {
        port = atoi(argv[1]);
    }
    else
    {
        port = PORT;
    }

    init_server_socket(&server_sockfd, port);

    if((client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, (socklen_t *)&sin_size)) < 0)
    {
        perror("accept error:");
        exit(0);    
    }

    printf("已成功与客户端建立了连接...\n");

    test_socket_io(&client_sockfd);

    close_socket(&client_sockfd);
    close_socket(&server_sockfd);

    return 0;    
}
复制代码

 

客户端

复制代码
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#if 1
#define IPADDR "127.0.0.1"    //本地服务器地址
#define PORT 9487            //本地服务器端口
#else
#define IPADDR "*.*.*.*"    //服务器地址
#define PORT 80        //服务器端口
#endif  

#define BUFFER_SIZE 4096

int main(int argc, char* argv[])
{
    int sockfd;
    struct sockaddr_in servaddr;
    char send_buf[BUFFER_SIZE], recv_buf[BUFFER_SIZE];

    int port;
    char ipaddr[BUFFER_SIZE];
    memset(ipaddr, 0, sizeof(ipaddr));
    if(argv[1] != NULL)
    {
        strcpy(ipaddr, argv[1]);
    }
    else
    {
        strcpy(ipaddr, IPADDR);
    }
    
    if(argv[2] != NULL)
    {
        port = atoi(argv[2]);
    }
    else
    {
        port = PORT;
    }
    printf("ip :%s\n", ipaddr);
    printf("port :%d\n", port);
    //初始化网络连接结构体
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(port);
    if(inet_pton(AF_INET, ipaddr, &servaddr.sin_addr) <= 0)
    {
        perror("Error: ");
        exit(0);    
    }

    //创建socket
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("Error: ");
        exit(0);    
    }
    //连接
    if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr_in)) < 0)
    {
        perror("Error: ");
        exit(0);    
    }

    printf("已成功与服务器建立了连接...\n");

    memset(send_buf, 0, sizeof(send_buf));
    strcat(send_buf, "hello server1");

    if(send(sockfd, send_buf, strlen(send_buf), 0) < 0)
    {
        perror("Error: ");    
        exit(0);
    }
    else
    {
        printf("send buf successful\n");
    }
    
    memset(recv_buf, 0, sizeof(recv_buf));
    recv(sockfd, recv_buf, sizeof(recv_buf) - 1, 0);
    printf("\n%s\n", recv_buf);

    close(sockfd);

    return 0;    
}
复制代码

 

posted @   roverqqq  阅读(122)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示