嵌入式学习日记(十二)

2019-07-12 18:08发布

2017-07-20

今天是嵌入式学习的第十二天


今天在受到老师的指引下,写一个简单的练手小程序。

关键字:Socket Internet,UDP协议,Internet版本IPv4


  • 话不多说,首先来看头文件(server和client都一样):
#include //标准IO #include //一些系统调用API #include //一些类型的定义 #include //socket的头文件 #include //sockaddr_in的头文件 具体头文件的一些函数啥的,请大家自行man。

  • 再定义一些方便的宏(server和client都一样):
#define PORT 8888 //端口号 #define IPADDR "127.0.0.1" //可以写其他地址(服务器端的地址)
  • 服务器源代码
//----------------------------------------------------server.c int main() { int sock_fd; //接收套接字的描述符 struct sockaddr_in sock_in; // char buffer[1024]; socklen_t len=sizeof(struct sockaddr_in); if(sock_fd=socket(AF_INET,SOCK_DGRAM,0)<0) //建立套接字,DGRAM是指定UDP协议 { perror("socket error! "); return 1; } sock_in.sin_family = AF_INET; //指定是Internet通信 sock_in.sin_port = htons(PORT); //端口号要转化 sock_in.sin_addr.s_addr = inet_addr(IPADDR); //IP地址的转译 bind(sock_fd,(struct sockaddr *)&sock_in, sizeof(struct sockaddr_in)); //绑定socket和地址(服务器端才需要) while(1) { socket_in ipaddr; //获取IP地址 char ipstr[16]; //存放IP地址 recvfrom(sock_fd,buffer,sizeof(buffer),0, (struct sockaddr *)&ipaddr,&len); //接收消息 inet_ntop(AF_INET,&ipaddr.sin_addr,ipstr,16); //将IP地址存放到ipstr中 printf("%s :%s ",ipstr,buffer); //输出 } close(sock_fd); //关闭套接字 return 0; }
  • 客户端源代码和服务器的差不多,只不过是没有bind(),并且接收换成发送即可
//----------------------------------------------------client.c int main() { int sock_fd; struct sockaddr_in server; char buffer[1024]; sock_fd=socket(AF_INET,SOCK_DGRAM,0); server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr.s_addr = inet_addr(IPADDR); while(1) { scanf("%s",buffer); sendto(sock_fd,buffer,sizeof(buffer),0, (struct sockaddr *)&server,sizeof(struct sockaddr_in)); } close(sock_fd); return 0; }

  好了,干货就这么多,不止可以在同一台电脑上执行,只需要将IPADDR的宏修改成server的IP地址,就可以由client向server发消息了!




  今日学会了socket编程的基础。以后还要在这基础上修改。