嵌入式linux TCP socket编程

2019-07-12 14:17发布

一、利用内核编程的API sendto  和  recvfrom

sendto()_Linux C函数

sendto(经socket传送数据)

相关函数

  send , sendmsg,recv , recvfrom , socket

表头文件

  #include < sys/types.h >   #include < sys/socket.h >

定义函数

  int sendto ( socket s , const void * msg, int len, unsigned int flags, const   struct sockaddr * to , int tolen ) ;

函数说明

  sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr的结构长度。

返回值

 返回值:成功则返回接收到的字符数,失败返回-1.

错误代码

  EBADF 参数s非法的socket处理代码。   EFAULT 参数中有一指针指向无法存取的内存空间。   WNOTSOCK 参数 s为一文件描述词,非socket。   EINTR 被信号所中断。   EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断的。   ENOBUFS 系统的缓冲内存不足。   EINVAL 传给系统调用的参数不正确。

定义函数

  ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);

函数说明

  recvfrom()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数len为可接收数据的最大长度.参数flags一般设0,其他数值定义参考recv().参数from用来指定欲传送的网络地址,结构sockaddr请参考bind()函数.参数fromlen为sockaddr的结构长度.  

返回值

 返回值:成功则返回接收到的字符数,失败返回-1.

错误代码

EBADF 参数s非合法的socket处理代码   EFAULT 参数中有一指针指向无法存取的内存空间。   ENOTSOCK 参数s为一文件描述词,非socket。   EINTR 被信号所中断。   EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。   ENOBUFS 系统的缓冲内存不足   ENOMEM 核心内存不足   EINVAL 传给系统调用的参数不正确。


范例

  #include < sys/types.h >   #include < sys/socket.h >   #include   #define PORT 2345 /*使用的port*/   main(){   int sockfd,len;   struct sockaddr_in addr;   char buffer[256];   /*建立socket*/   if(sockfd=socket (AF_INET,SOCK_DGRAM,0))<0){   perror (“socket”);   exit(1);   }   /*填写sockaddr_in 结构*/

  bzero ( &addr, sizeof(addr) );

  addr.sin_family=AF_INET;   addr.sin_port=htons(PORT);   addr.sin_addr=hton1(INADDR_ANY) ;   if (bind(sockfd, &addr, sizeof(addr))<0){   perror(“connect”);   exit(1);   }   while(1){   bzero(buffer,sizeof(buffer));   len = recvfrom(socket,buffer,sizeof(buffer), 0 , &addr &addr_len);   /*显示client端的网络地址*/   printf(“receive from %s “ , inet_ntoa( addr.sin_addr));   /*将字串返回给client端*/   sendto(sockfd,buffer,len,0,&addr,addr_len);”   }   }
二、利用socket文件描述符
write/read
TCPServer端 [cpp] view plain copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. //#include   
  9. #include   
  10. //#include   
  11. #include   
  12.   
  13. #include   
  14.   
  15. /** 
  16.   关于 sockaddr  sockaddr_in  socketaddr_un说明 
  17.   http://maomaozaoyue.blog.sohu.com/197538359.html 
  18.   */  
  19.   
  20. #define PORT    11910   //定义通信端口  
  21. #define BACKLOG 5       //定义侦听队列长度  
  22. #define buflen  1024  
  23.   
  24. void process_conn_server(int s);  
  25. void sig_pipe(int signo);  
  26.   
  27. int ss,sc;  //ss为服务器socket描述符,sc为某一客户端通信socket描述符  
  28.   
  29. int main(int argc,char *argv[])  
  30. {  
  31.   
  32.     struct sockaddr_in server_addr; //存储服务器端socket地址结构  
  33.     struct sockaddr_in client_addr; //存储客户端 socket地址结构  
  34.   
  35.     int err;    //返回值  
  36.     pid_t pid;  //分叉进行的ID  
  37.   
  38.     /*****************socket()***************/  
  39.     ss = socket(AF_INET,SOCK_STREAM,0); //建立一个序列化的,可靠的,双向连接的的字节流  
  40.     if(ss<0)  
  41.     {  
  42.         printf("server : server socket create error ");  
  43.         return -1;  
  44.     }  
  45.     //注册信号  
  46.     sighandler_t ret;  
  47.     ret = signal(SIGTSTP,sig_pipe);  
  48.     if(SIG_ERR == ret)  
  49.     {  
  50.         printf("信号挂接失败 ");  
  51.         return -1;  
  52.     }  
  53.     else  
  54.         printf("信号挂接成功 ");  
  55.   
  56.   
  57.     /******************bind()****************/  
  58.     //初始化地址结构  
  59.     memset(&server_addr,0,sizeof(server_addr));  
  60.     server_addr.sin_family = AF_INET;           //协议族  
  61.     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);   //本地地址  
  62.     server_addr.sin_port = htons(PORT);  
  63.   
  64.     err = bind(ss,(struct sockaddr *)&server_addr,sizeof(sockaddr));  
  65.     if(err<0)  
  66.     {  
  67.         printf("server : bind error ");  
  68.         return -1;  
  69.     }  
  70.   
  71.     /*****************listen()***************/  
  72.     err = listen(ss,BACKLOG);&nb