简单的lsocket编程,基于TCP和UDP协议实现的简单程序

简单的linux下socket编程,分别基于TCP和UDP协议实现的简单程序


linux下socket编程可以概括为以下几个函数的运用:

    socket()
    bind()
    listen()
    connect()
    accept()
    read()
    write()
    close()函数

基于TCP实现

流程


server代码

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
 
int main(int argc, char *argv[])
{
    //1.创建TCP套接字
    int sock_fd = 0;
    sock_fd = socket(AF_INET,SOCK_STREAM,0);
    if(sock_fd < 0)
    {
        perror("socket");
        close(sock_fd);
        exit(-1);
    }
    //2.定义并填充本机地址结构体信息
    struct sockaddr_in my_addr;
    bzero(&my_addr,sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(8080);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    //3.bind绑定本机地址
    int err_log = bind(sock_fd,(struct sockaddr *)&my_addr,sizeof(my_addr));
    if(err_log != 0)
    {
        perror("bind");
        close(sock_fd);
        exit(-1);
    }
    //4.listen监听,修改套接字的属性
    err_log = listen(sock_fd,10);
    if(err_log != 0)
    {
        perror("listen");
        close(sock_fd);
        exit(-1);
    }
    //5.调用accept从连接队列取出一条可用连接
    int acc_fd = 0;
    struct sockaddr_in client_addr;
    bzero(&client_addr,sizeof(client_addr));
    socklen_t client_len = sizeof(client_addr);
    printf("Listenning at 8080\n");
    acc_fd = accept(sock_fd,(struct sockaddr *)&client_addr,&client_len);
    if(acc_fd < 0)
    {
        perror("accept");
        return -1;
    }
    int num = 0;
    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork");
        return -1;
    }
    else if(pid == 0)
    {
        //6.通信
        while(1)
        {
            char buf_recv[1024] = "";
            int num = recv(acc_fd,buf_recv,sizeof(buf_recv),0);
            if(num > 0)
            {    
                printf("\rcline::%s\n",buf_recv);
                printf("cecv::");
                fflush(stdout);
            }
            if(num == 0)
            break;
        }
    }else    
    {
        while(1)
        {
            //    send();
            char buf[512] = "";
            printf("cecv::");
            fgets(buf,sizeof(buf),stdin);
            *(buf+strlen(buf)-1) = '\0';
            send(acc_fd,buf,strlen(buf),0);
 
        }
    }
    //7.close关闭连接套接字
    //8.close关闭监听套接字
    close(acc_fd);
    close(sock_fd);
    return 0;
}

 


client代码

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

int main(int argc, char *argv[])
{
    if(argc < 2)
    {
        return 0;
    }
    //创建TCP套接子、
    int sockfd = 0;
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd < 0)
    {
        perror("socket");
        exit(-1);
    }
    //定义并填充服务器地址结构体
    struct sockaddr_in ser_addr;
    bzero(&ser_addr,sizeof(ser_addr));
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_port = htons(atoi(argv[1]));
    ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//    inet_pton(AF_INET,argv[2],&ser_addr.sin_addr);
    //建立链接调用connect函数
    int err_log = connect(sockfd,(struct sockaddr *)&ser_addr,sizeof(ser_addr));
    if(err_log != 0)
    {
        perror("connect");
        close(sockfd);
        exit(-1);
    }
    //通信
    //send
    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork");
        return -1;
    }
    else if(pid == 0)
    {
        while(1)
        {
            char buf[512] = "";
            printf("cline::");
            fgets(buf,sizeof(buf),stdin);
            *(buf+strlen(buf)-1) = '\0';
            int len = send(sockfd,buf,strlen(buf),0);
            if(len < 0)
            {
                perror("send");
            }
        }
    }else
        while(1)
        {
            //recv
            char buf_recv[512]= "";
            recv(sockfd,buf_recv,sizeof(buf_recv),0);
            printf("\rcrecv::%s\n",buf_recv);
            printf("cline::");
            fflush(stdout);
        }
    //close关闭套接子
    close(sockfd);
    return 0;
}

 


基于UDP实现
流程


server代码

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
     
    int main(int argc, char *argv[])
    {
        int server_sockfd;
        int len;
        struct sockaddr_in my_addr;   //服务器网络地址结构体
            struct sockaddr_in remote_addr; //客户端网络地址结构体
        int sin_size;
        char buf[BUFSIZ];  //数据传送的缓冲区
        memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零
        my_addr.sin_family=AF_INET; //设置为IP通信
        my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上
        my_addr.sin_port=htons(8000); //服务器端口号
        
        /*创建服务器端套接字--IPv4协议,面向无连接通信,UDP协议*/
        if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
        {  
            perror("socket error");
            return 1;
        }
        
        /*将套接字绑定到服务器的网络地址上*/
        if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
        {
            perror("bind error");
            return 1;
        }
        sin_size=sizeof(struct sockaddr_in);
        printf("waiting for a packet.../n");
        
        /*接收客户端的数据并将其发送给客户端--recvfrom是无连接的*/
        if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)
        {
            perror("recvfrom error");
            return 1;
        }
        printf("received packet from %s:/n",inet_ntoa(remote_addr.sin_addr));
        buf[len]='/0';
        printf("contents: %s/n",buf);
     
        /*关闭套接字*/
        close(server_sockfd);
     
            return 0;
    }


client代码

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
     
    int main(int argc, char *argv[])
    {
        int client_sockfd;
        int len;
        struct sockaddr_in remote_addr; //服务器端网络地址结构体
        int sin_size;
        char buf[BUFSIZ];  //数据传送的缓冲区
        memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
        remote_addr.sin_family=AF_INET; //设置为IP通信
        remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址
        remote_addr.sin_port=htons(8000); //服务器端口号
     
            /*创建客户端套接字--IPv4协议,面向无连接通信,UDP协议*/
        if((client_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
        {  
            perror("socket error");
            return 1;
        }
        strcpy(buf,"This is a test message"); // 发送的内容
        printf("sending: '%s'/n",buf);
        sin_size=sizeof(struct sockaddr_in);
        
        /*向服务器发送数据包*/
        if((len=sendto(client_sockfd,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr)))<0)
        {
            perror("recvfrom");
            return 1;
        }
     
        /*关闭套接字*/
        close(client_sockfd);
     
        return 0;
    }



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值