c语言 socket send,C语言中send()函数和sendto()函数的使用方法

C语言send()函数:经socket传送数据头文件:

#include #include

定义函数:

int send(int s, const void * msg, int len, unsigned int falgs);

函数说明:send()用来将数据由指定的socket 传给对方主机. 参数s 为已建立好连接的socket. 参数msg 指向欲连线的数据内容, 参数len 则为数据长度. 参数flags 一般设0, 其他数值定义如下:

MSG_OOB 传送的数据以out-of-band 送出.

MSG_DONTROUTE 取消路由表查询

MSG_DONTWAIT 设置为不可阻断运作

MSG_NOSIGNAL 此动作不愿被SIGPIPE 信号中断.

返回值:成功则返回实际传送出去的字符数, 失败返回-1. 错误原因存于errno

错误代码:

EBADF 参数s 非合法的socket 处理代码.

EFAULT 参数中有一指针指向无法存取的内存空间

ENOTSOCK 参数s 为一文件描述词, 非socket.

EINTR 被信号所中断.

EAGAIN 此操作会令进程阻断, 但参数s 的socket 为不可阻断.

ENOBUFS 系统的缓冲内存不足

ENOMEM 核心内存不足

EINVAL 传给系统调用的参数不正确.

C语言sendto()函数:经socket传送数据头文件:

#include #include

定义函数: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

#include

#include

#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)

{

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);

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c语言socket编程主要使用read和recv等函数进行数据的读取。read函数的声明如下:ssize_t read(int fd, void *buf, size_t count),它从文件描述符fd读取count字节的数据到buf。而recv函数的声明如下:ssize_t recv(int sockfd, void *buf, size_t len, int flags),它从已连接的socket sockfd接收len字节的数据到buf。 除了read和recv函数,还有一些其他的函数可以用于数据的读取和写入,例如write函数send函数。write函数的声明如下:ssize_t write(int fd, const void *buf, size_t count),它将buf的count字节数据写入到文件描述符fdsend函数的声明如下:ssize_t send(int sockfd, const void *buf, size_t len, int flags),它将buf的len字节数据发送到已连接的socket sockfd。 此外,还有一些具有特定功能的函数,例如sendto和recvfrom函数,它们可以在数据发送和接收时指定目标地址。sendto函数的声明如下:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen),它将buf的len字节数据发送到指定地址dest_addr。recvfrom函数的声明如下:ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen),它从指定地址src_addr接收len字节的数据到buf。 另外,如果需要更通用的I/O函数,可以使用sendmsg和recvmsg函数。它们可以使用结构体msghdr来传递更多的信息。sendmsg函数的声明如下:ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags),它将msg的数据发送到已连接的socket sockfd。recvmsg函数的声明如下:ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags),它接收已连接的socket sockfd的数据到msg

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值