Linux环境下 UDP服务端/客户端代码

来源:互联网 发布:虚拟机快照限时软件 编辑:程序博客网 时间:2024/05/21 17:40

//发送端代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <error.h>
#include <stdlib.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    struct sockaddr_in s_addr;//结构体
    int sock;
    int addr_len;//获取结构长度
    int len;
    char buff[128];
    int yes;

    if (argc != 2)
    {    
        printf("Please input %s  IP\n",argv[1]);    
    }

    if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0))){  //以UDP方式创建socket
        perror("socket");
        exit(EXIT_FAILURE);
    }
    else
        printf("create  socket.\n\r");
    yes = 1;
    setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));  //设置socket为可发送广播消息
    
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(7838);//指定接收广播消息的端口
    
    if(argv[1]){
        s_addr.sin_addr.s_addr = inet_addr(argv[1]); //argv[1] 为广播消息的目的地址,即广播地址
    }
    else{
        printf("input server IP!\n");
        exit(0);
    }
    addr_len = sizeof(s_addr);
    strcpy(buff, "hello message");
//    while(1){
    int i;
    for(i=0; ; i++){
        len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*)&s_addr, addr_len);   //使用UDP广播的消息
        if(len < 0){
            printf("\n\rsend error.\n\r");
            exit(EXIT_FAILURE);
        }
        sleep(1);
        printf("send success %d:\tsend message is %s\n",i,&buff);
    }
    return 0;
}



接受端代码

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <error.h>
#include <stdlib.h>
#include <arpa/inet.h>
#define MAXSIZE 128

int main(int argc, char* argv[])
{
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;
    int sock;
    socklen_t addr_len;
    int len;
    char buff[MAXSIZE];
    if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0))){
        perror("socket");
        exit(EXIT_FAILURE);
    }
    else
        printf("create socket success\n");

    memset(&s_addr, 0 , sizeof(struct sockaddr_in));
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(7838);
    s_addr.sin_addr.s_addr = INADDR_ANY; //指示接收的数据IP,必须为此值,因为是广播,接收地址任意
    
    if(-1 == (bind(sock, (struct sockaddr*)&s_addr, sizeof(s_addr)))){
        perror("bind");
        exit(EXIT_FAILURE);
    }
    else{
        printf("bind address to socket.\n");
    }
    addr_len = sizeof(c_addr);
    while(1){
        len = recvfrom(sock, buff,sizeof(buff)-1, 0, (struct sockaddr*)&c_addr, &addr_len);//从服务端接收数据
        if(len < 0){
            perror("recvfrom failed...");
            exit(EXIT_FAILURE);
        }
    buff[len]= '\0';
    printf("receive come from %s:%d message:%s\n",inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port),buff);        
    }
    return 0;
}

原创粉丝点击