`
trophy
  • 浏览: 176773 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

无连接的客户/服务编程(sendto,recvfrom)

阅读更多

sendto(经socket传送数据)

相关函数
send , sendmsg,recv , recvfrom , socket
表头文件
#include < sys/types.h >
#include < sys/socket.h >
定义函数
int sendto ( int 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,错误原因存于errno 中。
错误代码
EBADF 参数s非法的socket处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间。
WNOTSOCK canshu s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。
ENOBUFS 系统的缓冲内存不足。
EINVAL 传给系统调用的参数不正确。

 

 

recvfrom(经socket接收数据)

 

相关函数
recv,recvmsg,send,sendto,socket
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);
函数说明
recv()用来接收远程主机经指定的socket 传来的数据,并把数据存到由参数buf 指向的内存空间,参数len 为可接收数据的最大长度。参数flags 一般设0,其他数值定义请参考recv()。参数from用来指定欲传送的网络地址,结构sockaddr 请参考bind()。参数fromlen为sockaddr的结构长度。
返回值
成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。
错误代码
EBADF 参数s非合法的socket处理代码
EFAULT 参数中有一指针指向无法存取的内存空间。
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。
ENOBUFS 系统的缓冲内存不足
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。

 

 

server.c

C代码 复制代码 收藏代码
  1. #include <sys/types.h>   
  2. #include <sys/socket.h>   
  3. #include <netinet/in.h>   
  4. #include <arpa/inet.h>   
  5. #include <unistd.h>   
  6. #include <stdlib.h>   
  7. #include <string.h>   
  8. #include <stdio.h>   
  9. #define PORT 1111 /*使用的port*/   
  10. main(){   
  11.     int sockfd,len;   
  12.     struct sockaddr_in addr;   
  13.     int addr_len = sizeof(struct sockaddr_in);   
  14.     char buffer[256];   
  15.     /*建立socket*/  
  16.     if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){   
  17.         perror ("socket");   
  18.         exit(1);   
  19.     }   
  20.     /*填写sockaddr_in 结构*/  
  21.     bzero ( &addr, sizeof(addr) );   
  22.     addr.sin_family=AF_INET;   
  23.     addr.sin_port=htons(PORT);   
  24.     addr.sin_addr.s_addr=htonl(INADDR_ANY) ;   
  25.     if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr))<0){   
  26.         perror("connect");   
  27.         exit(1);   
  28.     }   
  29.     while(1){   
  30.         bzero(buffer,sizeof(buffer));   
  31.         len = recvfrom(sockfd,buffer,sizeof(buffer), 0 , (struct sockaddr *)&addr ,&addr_len);   
  32.         /*显示client端的网络地址*/  
  33.         printf("receive from %s\n" , inet_ntoa( addr.sin_addr));   
  34.         /*将字串返回给client端*/  
  35.         sendto(sockfd,buffer,len,0,(struct sockaddr *)&addr,addr_len);   
  36.     }   
  37. }   
  38. client.c
C代码 复制代码 收藏代码
  1. #include <sys/types.h>   
  2. #include <sys/socket.h>   
  3. #include <netinet/in.h>   
  4. #include <arpa/inet.h>   
  5. #include <unistd.h>   
  6. #include <stdlib.h>   
  7. #include <string.h>   
  8. #include <stdio.h>   
  9. #define PORT 1111   
  10. #define SERVER_IP "127.0.0.1"   
  11. main()   
  12. {   
  13.     int s,len;   
  14.     struct sockaddr_in addr;   
  15.     int addr_len =sizeof(struct sockaddr_in);   
  16.     char buffer[256];   
  17.     /* 建立socket*/  
  18.     if((s = socket(AF_INET,SOCK_DGRAM,0))<0){   
  19.         perror("socket");   
  20.         exit(1);   
  21.     }   
  22.     /* 填写sockaddr_in*/  
  23.     bzero(&addr,sizeof(addr));   
  24.     addr.sin_family = AF_INET;   
  25.     addr.sin_port = htons(PORT);   
  26.     addr.sin_addr.s_addr = inet_addr(SERVER_IP);   
  27.     while(1){   
  28.         bzero(buffer,sizeof(buffer));   
  29.         /* 从标准输入设备取得字符串*/  
  30.         len =read(STDIN_FILENO,buffer,sizeof(buffer));   
  31.         /* 将字符串传送给server端*/  
  32.         sendto(s,buffer,len,0,(struct sockaddr *)&addr,addr_len);   
  33.         /* 接收server端返回的字符串*/  
  34.         len = recvfrom(s,buffer,sizeof(buffer),0,(struct sockaddr *)&addr,&addr_len);   
  35.         printf("receive: %s",buffer);   
  36.     }   
  37. }   

 此实例为无连接UDP,也可用connect函数实现已连接UDP.

(笔记以实例为主,详细理论见<<UNIX网络编程>>)

 

转自: http://lobert.iteye.com/blog/1769618

分享到:
评论

相关推荐

    基于Python进行TCP套接字编程的基础知识 实验报告

    基于UDP的无连接客户/服务器在Python实现中的工作流程如下: 1.首先在服务器端通过调用socket()创建套接字来启动一个服务器; 2.服务器调用bind()指定服务器的套接字地址,然后调用recvfrom()等待接收数据。 3.在...

    Linux的socket编程详解

    (如无请求,会阻塞程序进行等待) 客户端: 使用 connect() 建立连接,并获得服务器 Socket。 数据交互阶段 服务器或客户端: 使用 wirte() 对对方 Socket 进行数据写入。 服务器或客户端: 使用 read() 对对方 Socket ...

    linux programming instances网络编程教程 附源代码

    2.1.5 用fif0实现多客户服务 2.1.6 系统对管道和fif0的限制 2.2 消息队列 2.2.1 消息队列的数据结构 2.2.2 消息队列的创建 2.2.3 消息队列的操作 2.2.4 实例 2.2.5 消息队列的限制 2.3 信号量 ...

    精通Windows Sockets网络开发:基于Visual C++实现-带源码

    3.2.1面向连接与面向无连接 3.2.2可靠性与次序性 3.2.3面向消息 3.2.4部分消息 3.2.5从容关闭 3.2.6路由选择 3.2.7广播数据 3.3ip定址 3.3.1ip定址 3.3.2字节顺序问题 3.4基本tcp套接字编程 3.4.1wsastartup()函数...

    跨平台socket网络通信c语言实现

    实现window与linux网络的传输时间测试,可以估计网络的速度,利用sendto、recvfrom、gettimeofdate实现。

    Linux网络编程之UDP Socket程序示例

    在网络传输协议中,TCP协议...使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可以进行通信(recvfrom函数和sendto函数)了;客户端在用socket()生成一个套接字后就可以向服务

    TCP_IP详解卷1

    1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口...

    TCPIP详解--共三卷

    1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 ...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    第9章 POSIX Socket API:无连接的通信 219 9.1 将UDP Server方法添加到Echo Server Activity中 219 9.2 实现原生UDP Server 220 9.2.1 创建UDP Socket:socket 220 9.2.2 从Socket接收数据报:recvfrom 221 ...

    TCP/IP详解part_2

    1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口...

    易语言winsock完成端口

    winsock完成端口系统结构:接受连接线程,取错误文本,ServerWorkerThread,socket,WSASocket,WSAAccept,closesocket,Connect,Send,recv,WSARecv,bind,WSAStartup,WSACleanup,htons,inet_ntoa,inet_addr...sendto,recvfrom,

    TCPIP详解卷[1].part04

    1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口...

    TCPIP详解卷[1].part09

    1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口...

    TCPIP详解卷[1].part03

    1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口...

    TCPIP详解卷[1].part05

    1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口...

    TCPIP详解卷[1].part06

    1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口...

    TCPIP详解卷[1].part08

    1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口...

    TCPIP详解卷[1].part11

    1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口...

Global site tag (gtag.js) - Google Analytics