作为一个嵌入式开发者,在实际的研发项目中,常常需要编写socket网络编程接口,提供给软件开发人员。下面将提供一个常用的代码模板(客户端的功能可以用单片机多功能调试助手进行验证):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define BUFFSIZE 1024
void HandleClient(int sock)
{
char cmd_buffer[BUFFSIZE];
memset(cmd_buffer,'\0',sizeof(cmd_buffer));
int received;
/* 接收消息 */
if(((received=recv(sock, cmd_buffer, BUFFSIZE, 0))<0))
{
printf("recieve error!\n");
}
else
{
if(strncmp(cmd_buffer,"yulin",5)==0)
{
printf("Commander 74!\n");
send(sock,"Commander 74!", sizeof("Commander 74!"),0);
close(sock);
}
else if(strncmp(cmd_buffer,"ranjiejie",9)==0)
{
printf("ranranjie\n");
send(sock,"ranranjie", sizeof("ranranjie"),0);
close(sock);
}
else
{
printf("命令错误!\n");
send(sock,"ranranjie:is error", sizeof("ranranjie:is error"),0);
close(sock);
}
}
close(sock);
}
int main(int argc,char **argv)
{
//socket init
int listenfd,connfd;
struct sockaddr_in sockaddr;
listenfd = socket(AF_INET,SOCK_STREAM,0); //有面向流的(TCP)和面向数据报的 (UDP)Socket。分别取值 SOCK_STREAM 和 SOCK_DGRAM
if ( listenfd<0) // 创建socket,若成功,返回socket描述符
{
printf( "socket error!\n");
return 0;
}
int bind_free=1;
if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&bind_free,sizeof(bind_free))==-1){
printf( "setsockopt error!\n");
return 0;
}
memset(&sockaddr,0,sizeof(sockaddr));
sockaddr.sin_family = AF_INET; // IPv4 协议
sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY,来代表本机所有可用的网络地址
sockaddr.sin_port = htons(10982); //端口号
if(bind(listenfd,(struct sockaddr *) &sockaddr,sizeof(sockaddr))<0)//绑定地址和端口
{
printf("bind error!\n");
return 0;
}
if(listen(listenfd,1024)<0) //设置 Socket 为监听模式
{
printf( "listen error!\n");
return 0;
}
printf("Please wait for the client information\n");
while(1)
{
if((connfd = accept(listenfd,(struct sockaddr*)NULL,NULL))==-1)
{
printf("accpet socket error: %s errno :%d\n",strerror(errno),errno);
continue;
}
HandleClient(connfd);
}
close(listenfd);
}