Linux下socket编程之UDP

来源:互联网 发布:海康威视有线连接网络 编辑:程序博客网 时间:2024/06/06 10:58

代码如下:
udp_client.c

#include<stdio.h>#include<netinet/in.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<string.h>#include<arpa/inet.h>static void usage(char* proc){    printf("usage:%s[serverip][serverport]",proc);}int main(int argc,char* argv[]){    if(argc!=3)    {        usage(argv[0]);        return 1;    }    int sock=socket(AF_INET,SOCK_DGRAM,0);//要注意这里和TCP不同    struct sockaddr_in server_addr;    server_addr.sin_family=AF_INET;    server_addr.sin_port=htons(atoi(argv[2]));    server_addr.sin_addr.s_addr=inet_addr(argv[1]);    char buff[1024];    while(1)    {        printf("client:#");        fflush(stdout);        ssize_t n=read(0,buff,sizeof(buff)-1);        if(n>0)        {            buff[n]='\0';            sendto(sock,buff,strlen(buff),0,(struct sockaddr*)&server_addr,sizeof(server_addr));            ssize_t s=recvfrom(sock,buff,sizeof(buff)-1,0,NULL,NULL);            if(s>0)            printf("server echo:%s",buff);        }    }    close(sock);    return 0;}

udp_server.c

#include<stdio.h>#include<netinet/in.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<string.h>#include<arpa/inet.h>static void usage(char*proc){    printf("usage:%s,[ip][port]",proc);}int main(int argc,char* argv[]){    if(argc!=3)    {        usage(argv[0]);        return 1;    }    int sock=socket(AF_INET,SOCK_DGRAM,0);    if(sock<0)    {        perror("socket");        return 2;    }    struct sockaddr_in server_addr;    server_addr.sin_family=AF_INET;    server_addr.sin_port=htons(atoi(argv[2]));    server_addr.sin_addr.s_addr=inet_addr(argv[1]);    if(bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr))<0)    {        perror("bind");        return 3;    }    char buff[1024];    struct sockaddr_in client_addr;    socklen_t len=sizeof(server_addr);    while(1)    {        ssize_t recv=recvfrom(sock,buff,sizeof(buff)-1,0,(struct sockaddr*)&client_addr,&len);        if(recv>0)        {            buff[recv]='\0';            printf("client ip:%s,port:%d say:%s",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),buff);            sendto(sock,buff,strlen(buff),0,(struct sockaddr*)&client_addr,len);        }    }    close(sock);    return 0;}

udp和tcp的区别不是很大,如果理解了tcp那么udp也就很容易理解了,关键是要用好sendto和recvfrom两个函数,其他的应该是问题不大。
下面我把这两个函数拿出来大家看一下:
这里写图片描述

这里写图片描述
下面是测试udp服务器和客户端:
客户端

服务器端
大致也就这么多了,如果有错误、疑惑请评论