socket编程-TCP/UDP实例

在Linux环境下编写TCP通信和UDP通信。

socket编程-TCP通信

TCP Client

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

int main( int argc, char* argv[] )
{
    if( argc <= 3 )
    {
        printf( "usage: %s ip_address port_number send_data\n", basename( argv[0] ) );
        return 1;
    }
    const char* ip = argv[1];
    int port = atoi( argv[2] );
    const char* send_data =argv[3];

    struct sockaddr_in server_address;
    bzero( &server_address, sizeof( server_address ) );
    server_address.sin_family = AF_INET;
    inet_pton( AF_INET, ip, &server_address.sin_addr );
    server_address.sin_port = htons( port );

    int sockfd = socket( PF_INET, SOCK_STREAM, 0 ); //创建socket
    assert( sockfd >= 0 );
    if ( connect( sockfd, ( struct sockaddr* )&server_address, sizeof( server_address ) ) < 0 ) //发起连接
    {
        printf( "connection failed\n" );
    }
    else
    {   
        printf( "conenct to server %s:%d succeed.\n", ip , port);
        printf( "send data [%s] out\n", send_data );
        send( sockfd, send_data, strlen( send_data ), 0 ); //发送数据
    }

    close( sockfd );
    return 0;
}

TCP Server

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

#define BUF_SIZE 1024

int main(int argc, char *argv[])
{
    if (argc <= 2)
    {
        printf("usage: %s ip_address port_number\n", basename(argv[0]));
        return 1;
    }
    const char *ip = argv[1];
    int port = atoi(argv[2]);

    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_family = AF_INET;
    inet_pton(AF_INET, ip, &address.sin_addr);
    address.sin_port = htons(port);

    int sock = socket(PF_INET, SOCK_STREAM, 0); //创建socket
    assert(sock >= 0);

    int ret = bind(sock, (struct sockaddr *)&address, sizeof(address)); //命名socket
    assert(ret != -1);

    ret = listen(sock, 5); //监听socket
    assert(ret != -1);

    struct sockaddr_in client;
    socklen_t client_addrlength = sizeof(client);
    while (1)
    {
        int connfd = accept(sock, (struct sockaddr *)&client, &client_addrlength); //接受连接
        if (connfd < 0)
        {
            printf("errno is: %d\n", errno);
        }
        else
        {
            char buffer[BUF_SIZE];

            memset(buffer, '\0', BUF_SIZE);
            ret = recv(connfd, buffer, BUF_SIZE - 1, 0); //读取数据
            printf("got %d bytes from %s:%d\n" , ret , inet_ntoa(client.sin_addr) , ntohs(client.sin_port));
            printf("data [%s]\n", buffer );
            close(connfd);
        }
    }

    close(sock);
    return 0;
}

运行结果

tcp_client:

tcp_server:

socket编程-UDP通信

UDP Client

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

int main( int argc, char* argv[] )
{
    if( argc <= 3 )
    {
        printf( "usage: %s ip_address port_number send_data\n", basename( argv[0] ) );
        return 1;
    }
    const char* ip = argv[1];
    int port = atoi( argv[2] );
    const char* send_data =argv[3];

    struct sockaddr_in server_address;
    bzero( &server_address, sizeof( server_address ) );
    server_address.sin_family = AF_INET;
    inet_pton( AF_INET, ip, &server_address.sin_addr );
    server_address.sin_port = htons( port );

    int sockfd = socket( PF_INET, SOCK_DGRAM, 0 ); //创建socket
    assert( sockfd >= 0 );
    int ret = sendto( sockfd, send_data , strlen(send_data) , 0 , (struct sockaddr *)&server_address, sizeof(server_address));//发送数据
    if(ret>0){
        printf("send %d bytes to server %s:%d.\n" , ret , ip , port);
        printf("data [%s]\n", send_data );
    }else{
        printf("send data failed.\n");
    }
    close( sockfd );
    return 0;
}

UDP Server

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

#define BUF_SIZE 1024

int main(int argc, char *argv[])
{
    if (argc <= 2)
    {
        printf("usage: %s ip_address port_number\n", basename(argv[0]));
        return 1;
    }
    const char *ip = argv[1];
    int port = atoi(argv[2]);

    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_family = AF_INET;
    inet_pton(AF_INET, ip, &address.sin_addr);
    address.sin_port = htons(port);

    int sock = socket(PF_INET, SOCK_DGRAM, 0); //创建socket
    assert(sock >= 0);

    int ret = bind(sock, (struct sockaddr *)&address, sizeof(address)); //命名socket
    assert(ret != -1);

    struct sockaddr_in client;
    socklen_t client_addrlength = sizeof(client);
    char buffer[BUF_SIZE];
    while (1)
    {
        memset(buffer, '\0', BUF_SIZE);
        ret = recvfrom(sock, buffer, BUF_SIZE - 1, 0 , (struct sockaddr *)&client , &client_addrlength); //读取数据
        printf("got %d bytes from %s:%d\n" , ret , inet_ntoa(client.sin_addr) , ntohs(client.sin_port));
        printf("data [%s]\n", buffer );
    }
    close(sock);
    return 0;
}

运行结果

udp_client:

udp_server:

posted @ 2020-07-07 17:13  海物chinono  阅读(473)  评论(0)    收藏  举报