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
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #define PORT 1111 /*使用的port*/
- main(){
- int sockfd,len;
- struct sockaddr_in addr;
- int addr_len = sizeof(struct sockaddr_in);
- 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.s_addr=htonl(INADDR_ANY) ;
- if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr))<0){
- perror("connect");
- exit(1);
- }
- while(1){
- bzero(buffer,sizeof(buffer));
- len = recvfrom(sockfd,buffer,sizeof(buffer), 0 , (struct sockaddr *)&addr ,&addr_len);
- /*显示client端的网络地址*/
- printf("receive from %s\n" , inet_ntoa( addr.sin_addr));
- /*将字串返回给client端*/
- sendto(sockfd,buffer,len,0,(struct sockaddr *)&addr,addr_len);
- }
- }
- client.c
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #define PORT 1111
- #define SERVER_IP "127.0.0.1"
- main()
- {
- int s,len;
- struct sockaddr_in addr;
- int addr_len =sizeof(struct sockaddr_in);
- char buffer[256];
- /* 建立socket*/
- if((s = 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.s_addr = inet_addr(SERVER_IP);
- while(1){
- bzero(buffer,sizeof(buffer));
- /* 从标准输入设备取得字符串*/
- len =read(STDIN_FILENO,buffer,sizeof(buffer));
- /* 将字符串传送给server端*/
- sendto(s,buffer,len,0,(struct sockaddr *)&addr,addr_len);
- /* 接收server端返回的字符串*/
- len = recvfrom(s,buffer,sizeof(buffer),0,(struct sockaddr *)&addr,&addr_len);
- printf("receive: %s",buffer);
- }
- }
此实例为无连接UDP,也可用connect函数实现已连接UDP.
(笔记以实例为主,详细理论见<<UNIX网络编程>>)
相关推荐
`sendto()` 和 `recvfrom()` 是数据报套接字中最常用的两个函数,它们在无连接通信场景中提供了强大的功能。通过对这两个函数的理解和掌握,开发者可以更灵活地控制数据包的发送和接收过程,从而实现更加高效可靠的...
- **数据传输**:使用sendto()和recvfrom()函数发送和接收数据,它们需要指定目标或源地址。 - **无连接性**:UDP没有连接状态,因此不需要连接或断开过程。 在实际编程中,TCP常用于需要稳定性和可靠性的场景,...
只需创建套接字,然后使用sendto()发送数据,recvfrom()接收数据即可。 在学习TCP/IP协议编程时,理解这些基本概念和操作流程至关重要。同时,熟悉网络编程的常用工具,如Wireshark用于抓包分析,以及telnet和nc...
它提供了不可靠的、无连接的数据报文传输服务。UDP 协议的主要特点是提供了-best-effort 的传输服务,也就是说它不能保证数据的可靠传输,但可以提供较高的传输速度。 UDP 客户/服务器程序设计 本设计实现了一个...
TCP(传输控制协议)提供面向连接的服务,UDP(用户数据报协议)则提供无连接服务。IP(Internet协议)负责信息的传递机制。 **Socket编程** 在Linux中,基于BSD Socket的网络编程是通过Socket函数来实现的。首先,...
1. **UDP套接字编程**:在C/C++中,我们使用`socket()`函数创建套接字,`bind()`绑定IP地址和端口,`recvfrom()`接收数据,`sendto()`发送数据。在Python中,可以使用`socket.SOCK_DGRAM`指定UDP协议。 2. **端口号...
相比之下,UDP是一种无连接的协议,它不保证数据的顺序和完整性,也不提供重传服务,但它的优点在于传输效率高,延迟较低,适合于实时性要求高的应用场景,如视频通话、在线游戏等。 在C语言中,进行网络编程时,...
而在"socket_udp"文件中,可能会展示UDP套接字编程的实例,展示如何实现无连接的数据发送和接收。 总的来说,Linux TCP和UDP编程需要对网络协议有深入理解,并熟练掌握套接字API的使用。这不仅可以帮助开发者构建...
基于UDP的无连接客户/服务器在Python实现中的工作流程如下: 1.首先在服务器端通过调用socket()创建套接字来启动一个服务器; 2.服务器调用bind()指定服务器的套接字地址,然后调用recvfrom()等待接收数据。 3.在...
- `sendto()`和`recvfrom()`适用于UDP协议,它们可以指定目标地址和端口,因为UDP是无连接的,每个数据包都可能到达不同的目的地。 6. **非阻塞编程**: 非阻塞Socket编程是解决多并发问题的一种方法,通过设置...
UDP是一种无连接的传输层协议,相比TCP(传输控制协议),它不提供可靠的数据传输服务,没有拥塞控制和顺序保证,但具有较低的开销和更快的传输速度。在某些实时性要求高或数据丢失可接受的应用场景下,UDP成为首选...
相比之下,UDP是一种无连接的协议,它不保证数据的顺序或可靠性,但具有更低的延迟和更高的效率。在UDP编程中,数据被封装在数据报(datagram)中,每个数据报独立发送,可能会出现丢失、重复或乱序的情况。尽管如此...
此外,对于无连接的协议(如UDP),通常使用`sendto()`和`recvfrom()`函数进行数据发送和接收,无需预先建立连接,且发送方不需要绑定到特定的端口。 在实际应用中,面向连接的套接字通常用于需要保证数据完整性和...
UDP(User Datagram Protocol,用户数据报协议)是传输层的一种无连接、不可靠的协议,适合于对实时性要求高的应用。在这个项目中,我们将深入探讨如何在Windows平台上,利用C++和C语言实现基于UDP的客户机/服务器...
对于UDP,服务器和客户端都可以直接使用`bind()`函数绑定端口,然后通过`sendto()`和`recvfrom()`进行数据收发。 在"Server与Client的交互(1).ppt"中,可能详细介绍了服务器和客户端的交互流程,包括TCP连接的...
- **流式套接口(SOCK_STREAM)**: 提供可靠、面向连接的双向数据传输服务,保证数据无差错、无重复地发送。适用于需要大量数据传输且对数据完整性要求高的场景。 - **数据报套接口(SOCK_DGRAM)**: 提供无连接、不...
服务器和客户端都可以直接使用sendto()和recvfrom()发送和接收数据。由于UDP是无连接的,因此需要处理数据包乱序、丢失等问题。 五、跨平台兼容性 套接字编程通常遵循POSIX标准,使得编写的应用程序可以在多种操作...
5. 客户机连接:客户机使用`connect`函数(TCP)或`sendto`函数(UDP)找到服务器的IP和端口。 6. 数据传输:使用`send`/`recv`(TCP)或`sendto`/`recvfrom`(UDP)发送和接收数据。 7. 清理资源:完成通信后,使用...