基于socket的TCP和UDP通讯的简单建立

最近在学习Linux网络编程,写下此学习笔记。

一、建立简单TCP连接的步骤:

服务器端:
    1.调用socket()函数定义套接字;
    2.调用bind()函数绑定本地地址和端口;
    3.调用listen()函数启动监听端;
    4.调用accept()函数从已连接队列中提取客户链接,accept为阻塞类型函数,当连接队列为空时,阻塞等待;
    5.调用IO函数与客户端通讯;
    6.关闭套接字;
客户端:
    1.  调用socket()函数创建套接字;
    2.  调用connect()函数链接服务器端;
    3.  调用IO函数(read/write等)与服务器端进行通讯;
    4.  调用close()关闭套接字。

二、建立简单UDP连接的步骤:

服务器端:
    1.调用socket()函数定义套接字
    2.调用bind()函数绑定本地地址和端口;
    3.调用recvfrom()和sendto()函数进行通信;
客户端
    1.调用socket()函数创建套接字;
    2.调用recvfrom()和sendto()函数进行通信;
/* * TCP--server */
#include  
#include 
#include 
#include 
#include 
#include 

int main(int argc,char*argv[]) // 执行时候输入端口号
{
    if(argc != 2)
    {
        printf("too few arg!\n");
        exit(1);
    }

    /* 1.创建套接字 */
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    printf("sockfd:%d\n",sockfd); 

    /* 2.绑定地址 */
    struct sockaddr_in srvaddr,cliaddr;
    socklen_t len = sizeof(srvaddr);
    bzero(&srvaddr,len);

    srvaddr.sin_family = AF_INET;
    srvaddr.sin_port = htons(atoi(argv[1]));
    srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(sockfd,(struct sockaddr *)&srvaddr,len);

    /* 3.监听套接字 */
    listen(sockfd,5); // “5”表示最大监听个数为5

    char peer[16];
    /* 4.等待客户端发起连接,连接成功就返回一个新的文件描述符 */
    int connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);
    if(connfd > 0)
    {
        printf("new client connect:[%s]\n",
                (char *)inet_ntop(AF_INET,&cliaddr.sin_addr,peer,len)
                );  
    }

    char buf[100]; // 用于存放读取到的数据

    while(1)
    {
        /* 每次读取前清空缓冲区 */
        bzero(buf,100);

        /* 阻塞读取数据 */
        //read(connfd,buf,sizeof(buf)); 可以直接调用IO函数
        recv(connfd,buf,sizeof(buf),0);

        printf("from client:%s\n",buf);

        /* 如果客户端发出“quit”则退出 */
        if(strncmp(buf,"quit",4) == 0)
            break;

    }
    /* 通讯完毕,关闭套接字 */
    close(connfd);
    close(sockfd);

    return 0;
}
/* * TCP---client */

#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    if (argc != 3)
    {
        fprintf(stderr, " too few arg for %s\n", argv[0]);
        exit(1);
    }

    /* 1.创建套接字 */
    int sockfd = socket (AF_INET, SOCK_STREAM, 0);
    printf("sockfd : %d\n", sockfd);

    /* 设置服务器ip与端口号 */
    struct sockaddr_in seraddr;

    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(atoi(argv[2]));
    inet_pton(AF_INET, argv[1], &seraddr.sin_addr);

    /* 发送连接请求 */
    int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));
    if (ret == -1)
    {
        fprintf(stderr, "connect error!\n" );   
        exit(1);
    }

    /* 发送消息 */
    char buf[100];  //用于存储发送的数据
    while(1)
    {
        bzero(buf, 100);
        fgets(buf, 100, stdin);
        send(sockfd, buf, strlen(buf),0);
        if (strncmp(buf, "quit", 4) == 0)
            break;  
    }

    /* 通讯结束,关闭套接字 */
    close(sockfd);  
    return 0;
}
/* * UDP -----server */
 #include  
#include 
#include 
#include 
#include 
#include 

int main(int argc,char *argv[]) // 执行时需要指定端口号
{
    /* 1.创建套接字 */
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);

    /* 2.绑定服务器地址 */
    struct sockaddr_in srvaddr;

    srvaddr.sin_family = AF_INET;
    srvaddr.sin_port = htons(atoi(argv[1]));
    srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(srvaddr));

    /* 3.调用IO函数进行通讯 */
    char buf[100];
    struct sockaddr_in cliaddr;
    socklen_t len = sizeof(cliaddr);

    while(1)
    {
        bzero(buf,100);
        bzero(&cliaddr,len);

        recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&len);

        printf("from client:%s",buf);

        if(strncmp(buf,"quit",4) == 0)
            break;
    }

    /* 4.关闭套接字文件 */
    close(sockfd);
}
/* * UDP----client */
/* UDP客户端 */

#include  
#include 
#include 
#include 
#include 
#include 

int main(int argc,char *argv[]) // ./Jack 192.168.1.3 50001
{
    /* 1.创建套接字 */
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);

    /* 2.设置服务器的IP与端口号 */
    struct sockaddr_in srvaddr;

    srvaddr.sin_family = AF_INET;
    srvaddr.sin_port = htons(atoi(argv[2]));
    inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);

    /* 调用IO函数进行通讯 */
    char buf[100];
    while(1)
    {
        bzero(buf,100);

        fgets(buf,100,stdin);

        sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&srvaddr,sizeof(srvaddr));

        if(strncmp(buf,"quit",4) == 0)
            break;  
    }

    /* 4.关闭套接字 */
    close(sockfd);

    return 0;
}

你可能感兴趣的:(Linux)