C语言sendto()函数-经socket传送数据以及recvfrom函数《转》

相关函数: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 中.

错误代码:
1、EBADF 参数s 非法的socket 处理代码.
2、EFAULT 参数中有一指针指向无法存取的内存空间.
3、WNOTSOCK canshu s 为一文件描述词, 非socket.
4、EINTR 被信号所中断.
5、EAGAIN 此动作会令进程阻断, 但参数s 的soket 为补课阻断的.
6、ENOBUFS 系统的缓冲内存不足.
7、EINVAL 传给系统调用的参数不正确.

范例
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet.in.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)
    {
        bezro(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);
    }
}
执行:请参考recvfrom()
 
 
 
/*利用socket的UDPclient
此程序会连线UDPserver,并将键盘输入的字符串传给server。
UDPserver范例请参考sendto()。
*/
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#definePORT2345
#defineSERVER_IP“127.0.0.1”
main()
{
ints,len;
structsockaddr_inaddr;
intaddr_len= sizeof (structsockaddr_in);
charbuffer[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,(structsockaddr*)&addr,addr_len);
/*接收server端返回的字符串*/
len=recvfrom(s,buffer, sizeof (buffer),0,(structsockaddr*)&addr,(socklen_t*)
&addr_len);
printf (“receive:%s”,buffer);
}
}
执行(先执行udpserver再执行udpclient)
hello /*从键盘输入字符串*/
receive:hello /*server端返回来的字符串*/

转载于:https://www.cnblogs.com/splovecyk/p/4449365.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值