嵌入式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
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
-
#include
-
-
#include
-
-
#include
-
-
-
-
-
-
-
#define PORT 11910 //定义通信端口
-
#define BACKLOG 5 //定义侦听队列长度
-
#define buflen 1024
-
-
void process_conn_server(int s);
-
void sig_pipe(int signo);
-
-
int ss,sc;
-
-
int main(int argc,char *argv[])
-
{
-
-
struct sockaddr_in server_addr;
-
struct sockaddr_in client_addr;
-
-
int err;
-
pid_t pid;
-
-
-
ss = socket(AF_INET,SOCK_STREAM,0);
-
if(ss<0)
-
{
-
printf("server : server socket create error
");
-
return -1;
-
}
-
-
sighandler_t ret;
-
ret = signal(SIGTSTP,sig_pipe);
-
if(SIG_ERR == ret)
-
{
-
printf("信号挂接失败
");
-
return -1;
-
}
-
else
-
printf("信号挂接成功
");
-
-
-
-
-
memset(&server_addr,0,sizeof(server_addr));
-
server_addr.sin_family = AF_INET;
-
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-
server_addr.sin_port = htons(PORT);
-
-
err = bind(ss,(struct sockaddr *)&server_addr,sizeof(sockaddr));
-
if(err<0)
-
{
-
printf("server : bind error
");
-
return -1;
-
}
-
-
-
err = listen(ss,BACKLOG);&nb
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮