嵌入式linux TCP socket编程

本文详细介绍了在嵌入式Linux环境下如何进行TCP Socket编程,包括使用sendto和recvfrom函数,以及服务器端的socket创建、bind、listen和accept操作。文章通过示例代码展示了服务器和客户端的交互过程,解释了处理连接请求和数据通信的方法。
摘要由CSDN通过智能技术生成

一、利用内核编程的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 <arpa.inet.h>
  #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\n “ , inet_ntoa( addr.sin_addr));
  /*将字串返回给client端*/
  sendto(sockfd,buffer,len,0,&addr,addr_len);”

  }

  }


二、利用socket文件描述符

write/read


TCPServer端

[cpp]  view plain   copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <strings.h>  
  4. #include <sys/types.h>  
  5. #include <sys/socket.h>  
  6. #include <memory.h>  
  7. #include <unistd.h>  
  8. //#include <linux/in.h>  
  9. #include <netinet/in.h>  
  10. //#include <linux/inet_diag.h>  
  11. #include <arpa/inet.h>  
  12.   
  13. #include <signal.h>  
  14.   
  15. /** 
  16.   关于 sockaddr  sockaddr_in  socketaddr_un说明 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值