linux c编程之UDP

来源:互联网 发布:广东网络干部学院 编辑:程序博客网 时间:2024/05/19 21:17

本文参考自   21天学通linux c编程

socket编程可参考:

socket编程:

http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

http://www.kuqin.com/networkprog/20080512/8361.html

网络字节顺序以及转换函数

http://blog.sina.com.cn/s/blog_4ad7c25401019qqb.html


1,设置套接字

2,读取套接字状态

3,UDP客户端实现

4,UDP服务器实现



1,设置套接字

2,读取套接字状态

#include<sys/types.h>#include<sys/socket.h>#include<stdio.h>int  main(){  int s;  int val=1,len,i ;  len= sizeof(int);  if((s = socket(AF_INET,SOCK_STREAM,0))<0)    //creat  {    perror("connect");    exit(1);  }  else  {    printf("a socket was created.\n");    printf("socket number:%d\n",s);   }   i=setsockopt(s,SOL_SOCKET,SO_TYPE,&val,len);   //set   if("i==0")   {     printf("set socket ok.\n.");    }    else   {     printf("set socket error.\n.");    }    getsockopt(100,SOL_SOCKET,SO_TYPE,&val,&len);  //get   perror("socket");}

3,UDP客户端实现

有些编译器报错则在使用addr时(struct sockaddr *)&addr

#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/socket.h>#define REMOTEPORT 4567#define REMOTEIP "127.0.0.1"int   main(int argc,char *argv[]){    int s,len;    struct sockaddr_in addr;    int addr_len;    char msg[256];    int i=0;         if (( s= socket(AF_INET, SOCK_DGRAM, 0) )<0)   //建立一个socket    {        perror("error");        exit(1);    }    else    {    printf("socket created .\n");    printf("socked id: %d \n",s);    printf("remote ip: %s \n",REMOTEIP);    printf("remote port: %d \n",REMOTEPORT);    }          len=sizeof(struct sockaddr_in);        //长度    bzero(&addr,sizeof(addr));    addr.sin_family=AF_INET;              //添加端口与地址信息    addr.sin_port=htons(REMOTEPORT);    addr.sin_addr.s_addr=inet_addr(REMOTEIP);                while (1)    {    bzero(msg,sizeof(msg));        len = read(STDIN_FILENO,msg,sizeof(msg));        sendto(s,msg,len,0,&addr,addr_len);                 //发送信息        printf("\nInput message: %s \n",msg);        len= recvfrom (s,msg,sizeof(msg),0,&addr,&addr_len);/*这是接收到的信息。*/        printf("%d :",i);        i++;        printf("Received message: %s \n",msg);              /*这是服务器返回的信息。*/    }   } 


4,UDP服务器实现

有些编译器报错则在使用addr时(struct sockaddr *)&addr

#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#define LOCALPORT 4567int   main(int argc,char *argv[]){    int mysock,len;    struct sockaddr_in addr;    int i=0;    char msg[256];    int addr_len;              if (( mysock= socket(AF_INET, SOCK_DGRAM, 0) )<0)    {        perror("error");        exit(1);    }    else    {    printf("socket created .\n");    printf("socked id: %d \n",mysock);}       addr_len=sizeof(struct sockaddr_in);    bzero(&addr,sizeof(addr));    addr.sin_family=AF_INET;    addr.sin_port=htons(LOCALPORT);    addr.sin_addr.s_addr=htonl(INADDR_ANY);          if(bind(mysock,&addr,sizeof(addr))<0)    {        perror("connect");        exit(1);    }    else    {    printf("bind ok.\n");    printf("local port :%d \n",LOCALPORT);    }      while (1)    {    bzero(msg,sizeof(msg));        len= recvfrom (mysock,msg,sizeof(msg),0,&addr,&addr_len);/*接收到信息*/        printf("%d :",i);        i++;        printf("message from : %s \n",inet_ntoa(addr.sin_addr));        printf("  message length : %d \n",len);        printf("  message : %s \n\n",msg);        sendto(mysock,msg,len,0,&addr,addr_len); /*以上将字符串返回给客户端*/    }  }