linux socket udp传输笔记

分为udp server/clienet, 基于同步来做.

直接看代码:

服务端代码:

#include 

#include 

#include 
#include 

#include 
#include 


int main(int argc, const char * argv[]) {
    // insert code here...
    
    //同步的
    //服务端 ---
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0) {
        printf("create socket dgram error\n");
        return -1;
    }
    
    const char* local_ip = "0.0.0.0";
    int port = 996;
    
    //头文件:>
    struct sockaddr_in local;
    local.sin_port = htons(port);
    local.sin_family = AF_INET;

    //inet_addr:将一个十进制端ip转化为长整型数
    //头文件:,windows下在:
    local.sin_addr.s_addr = inet_addr(local_ip);
    
    //bind(int, const struct sockaddr *, socklen_t)
    
    //bind
    int ret = bind(sock, (const struct sockaddr*)&local, sizeof(local) );
    if( ret < 0 )
    {
        printf("bind fail \n");
        return -1;
    }
    
    char buf [1024];
    struct sockaddr_in client;
    
    socklen_t len = sizeof(client);
    
    //通过socket接收数据,成功返回接收到的字符数,失败返回-1,错误原因保存在errno中.
    //ssize_t recvfrom(
//    int sockfd,  --
//    void *buf, --数据保存到buf指定的内存空间
//    size_t len, --可接收数据的最大长度
//    unsigned int flags,  -- 一般为0
//    struct sockaddr *from, -- 传送过来的网络地址
//    socket_t *fromlen; -- from结构体的长度
    printf("start recv data....... \n");
    ssize_t s= recvfrom(sock, buf, sizeof(buf)-1,0, (struct sockaddr*)&client, &len);
    if(s < 0)
    {
        printf("recvfrom error \n");
        return -1;
    }
    
    printf("len:%ld -- content:%s \n" , s , buf);

    //头文件:
    close(sock);
    
    return 0;
}

客户端代码:

#include 

#include 
#include 
#include 
#include 
#include 

int main(int argc, const char * argv[]) {
    // insert code here...
    
    int sock = socket(AF_INET,SOCK_DGRAM,0);
    if (sock < 0) {
        printf("create socket dgram error\n");
        return -1;
    }
    
    int port = 996;
    struct sockaddr_in server;
    server.sin_port = htons(port);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    
    //发送端不需要绑定端口
    char* buf = "hello world\0";
    struct sockaddr_in peer;
    socklen_t len = sizeof(peer);
    
    //发送数据
    
    //通过socket发送数据,返回实际发送数据的字节数,失败返回-1,错误码保存在errno中
//    sendto(int,
//           const void * buf,  --要发送端内容的内存位置
//           size_t len, --指定发送数据的长度
//           int flags,
//           const struct sockaddr *,
//           socklen_t)
    
    ssize_t s = sendto(sock, buf, strlen(buf), 0, (struct sockaddr*)&server, sizeof(server));
    if(s < 0)
    {
        printf("send data fail\n");
        return -1;
    }
    
    close(sock);
    return 0;
}

测试结果:

首先启动服务端,服务器会同步等待,直到有数据过来:
linux socket udp传输笔记_第1张图片

你可能感兴趣的:(c/c++/c++,11)