`
trophy
  • 浏览: 178653 次
  • 性别: 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

分享到:
评论

相关推荐

    recvfrom()和sendto()函数

    `sendto()` 和 `recvfrom()` 是数据报套接字中最常用的两个函数,它们在无连接通信场景中提供了强大的功能。通过对这两个函数的理解和掌握,开发者可以更灵活地控制数据包的发送和接收过程,从而实现更加高效可靠的...

    TCP/UDP编程总结

    - **数据传输**:使用sendto()和recvfrom()函数发送和接收数据,它们需要指定目标或源地址。 - **无连接性**:UDP没有连接状态,因此不需要连接或断开过程。 在实际编程中,TCP常用于需要稳定性和可靠性的场景,...

    TCP/IP协议编程

    只需创建套接字,然后使用sendto()发送数据,recvfrom()接收数据即可。 在学习TCP/IP协议编程时,理解这些基本概念和操作流程至关重要。同时,熟悉网络编程的常用工具,如Wireshark用于抓包分析,以及telnet和nc...

    计算机网络课程设计(编写UDP客户/服务器程序)

    它提供了不可靠的、无连接的数据报文传输服务。UDP 协议的主要特点是提供了-best-effort 的传输服务,也就是说它不能保证数据的可靠传输,但可以提供较高的传输速度。 UDP 客户/服务器程序设计 本设计实现了一个...

    Linux TCP/IP编程

    TCP(传输控制协议)提供面向连接的服务,UDP(用户数据报协议)则提供无连接服务。IP(Internet协议)负责信息的传递机制。 **Socket编程** 在Linux中,基于BSD Socket的网络编程是通过Socket函数来实现的。首先,...

    UDP聊天程序_rowqfw_网络编程_udp进行c/s编程_

    1. **UDP套接字编程**:在C/C++中,我们使用`socket()`函数创建套接字,`bind()`绑定IP地址和端口,`recvfrom()`接收数据,`sendto()`发送数据。在Python中,可以使用`socket.SOCK_DGRAM`指定UDP协议。 2. **端口号...

    tcp.rar_UDP recvfrom_tcp_tcp sendto_udp 函数_udp_sendto

    相比之下,UDP是一种无连接的协议,它不保证数据的顺序和完整性,也不提供重传服务,但它的优点在于传输效率高,延迟较低,适合于实时性要求高的应用场景,如视频通话、在线游戏等。 在C语言中,进行网络编程时,...

    tcp_udp.rar_LINUX TCP _Linux/Unix编程_TCP UDP Linux_tcp udp 互联网

    而在"socket_udp"文件中,可能会展示UDP套接字编程的实例,展示如何实现无连接的数据发送和接收。 总的来说,Linux TCP和UDP编程需要对网络协议有深入理解,并熟练掌握套接字API的使用。这不仅可以帮助开发者构建...

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

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

    Socket编程资料收集

    - `sendto()`和`recvfrom()`适用于UDP协议,它们可以指定目标地址和端口,因为UDP是无连接的,每个数据包都可能到达不同的目的地。 6. **非阻塞编程**: 非阻塞Socket编程是解决多并发问题的一种方法,通过设置...

    Udp客户机和服务器编程

    UDP是一种无连接的传输层协议,相比TCP(传输控制协议),它不提供可靠的数据传输服务,没有拥塞控制和顺序保证,但具有较低的开销和更快的传输速度。在某些实时性要求高或数据丢失可接受的应用场景下,UDP成为首选...

    TCP/UDP 网络编程

    相比之下,UDP是一种无连接的协议,它不保证数据的顺序或可靠性,但具有更低的延迟和更高的效率。在UDP编程中,数据被封装在数据报(datagram)中,每个数据报独立发送,可能会出现丢失、重复或乱序的情况。尽管如此...

    网络编程(二) —— 套接字编程原理

    此外,对于无连接的协议(如UDP),通常使用`sendto()`和`recvfrom()`函数进行数据发送和接收,无需预先建立连接,且发送方不需要绑定到特定的端口。 在实际应用中,面向连接的套接字通常用于需要保证数据完整性和...

    基于UDP在Windows平台下的客户机/服务器模型(C++/C)

    UDP(User Datagram Protocol,用户数据报协议)是传输层的一种无连接、不可靠的协议,适合于对实时性要求高的应用。在这个项目中,我们将深入探讨如何在Windows平台上,利用C++和C语言实现基于UDP的客户机/服务器...

    tcp udp 编程

    对于UDP,服务器和客户端都可以直接使用`bind()`函数绑定端口,然后通过`sendto()`和`recvfrom()`进行数据收发。 在"Server与Client的交互(1).ppt"中,可能详细介绍了服务器和客户端的交互流程,包括TCP连接的...

    socket网络编程

    - **流式套接口(SOCK_STREAM)**: 提供可靠、面向连接的双向数据传输服务,保证数据无差错、无重复地发送。适用于需要大量数据传输且对数据完整性要求高的场景。 - **数据报套接口(SOCK_DGRAM)**: 提供无连接、不...

    套接字socket编程文档

    服务器和客户端都可以直接使用sendto()和recvfrom()发送和接收数据。由于UDP是无连接的,因此需要处理数据包乱序、丢失等问题。 五、跨平台兼容性 套接字编程通常遵循POSIX标准,使得编写的应用程序可以在多种操作...

    客户机与服务器

    5. 客户机连接:客户机使用`connect`函数(TCP)或`sendto`函数(UDP)找到服务器的IP和端口。 6. 数据传输:使用`send`/`recv`(TCP)或`sendto`/`recvfrom`(UDP)发送和接收数据。 7. 清理资源:完成通信后,使用...

Global site tag (gtag.js) - Google Analytics