调用socket send()返回失败是怎么回事?

mediaWorker 2010-01-28 11:50:16
我的代码是这样写的:
1、生成一个socket
socket1=socket(AF_INET,SOCK_DGRAM,0);
2、建立socket与服务器的连接
connect(socket1, (const sockaddr *)&server, len) ;//申请UDP套接字
3、发送数据
while(buf_len)
{
send( socket1, sendbuf, bytes, 0 );//发送rtp包
}

问题的现象是:对send()函数的调用一次成功一次失败,成功时返回发送的字节数,失败时返回-1.请问为何会出现send失败的情况?多谢各位大侠!
...全文
3319 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
arczee 2010-01-29
  • 打赏
  • 举报
回复
可能是你的缺少对错误的处理,比如,socket函数可能返回错误,因为一般socket是不能重用的,看你给出的程序就没做错误的处理,如果socket1变量得到一个负值,sendto肯定是失败的
mediaWorker 2010-01-29
  • 打赏
  • 举报
回复
因为使用send()需要connect(),所以改成sendto()来发送数据,却发现有时sendto()也会失败,错误提示为:bad file descriptor。请问这个file descriptor是指什么?是socket描述字吗?
Wind_Runner 2010-01-29
  • 打赏
  • 举报
回复
用了connect为udp套接口指定了宿主机的ip地址端口号,
就可以直接用fread fwrite了

至于connect失败, “UDP客户进程或服务器进程仅仅在使用自己的UDP套接口与确定的唯一对端进行通信时,才可以调用connect.” unp 第八章udp编程说明。
mediaWorker 2010-01-29
  • 打赏
  • 举报
回复
使用strerror()函数解释send()出错的返回值,提示Connection refused,看来send不成功是因为connect失败导致的,那connect为什么会失败呢?而且还是有时connect成功,有时失败。
yanghehong 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mediaworker 的回复:]
原因查明了,原来是我不小心增加了一个close(socket1);导致第一次sendto()能成功,后面的都失败。
多谢各位的帮助!
[/Quote]

恭喜找到症结!


- 千里孤行
mediaWorker 2010-01-29
  • 打赏
  • 举报
回复
原因查明了,原来是我不小心增加了一个close(socket1);导致第一次sendto()能成功,后面的都失败。
多谢各位的帮助!
mediaWorker 2010-01-29
  • 打赏
  • 举报
回复
To shenyan0712,

我在每次调用sendto()之前都打印的socket1的值,发现都是一个相同的正数,即socket1变量没问题,这样就排除了你说的错误处理的原因。谢谢!
yanghehong 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 mediaworker 的回复:]
我的代码是这样写的:
1、生成一个socket
socket1=socket(AF_INET,SOCK_DGRAM,0);
2、建立socket与服务器的连接
connect(socket1, (const sockaddr *)&server, len) ;//申请UDP套接字
3、发送数据
while(buf_len)
{
    send( socket1, sendbuf, bytes, 0 );//发送rtp包
}

问题的现象是:对send()函数的调用一次成功一次失败,成功时返回发送的字节数,失败时返回-1.请问为何会出现send失败的情况?多谢各位大侠!
[/Quote]

你声明的socket选项为SOCK_DGRAM,说明你使用的是UDP: socket(AF_INET,SOCK_DGRAM,0)

UDP协议是无连接的。所有你的UDPsocket不需要连接,也就是不需要 connect:

connect(socket1, (const sockaddr *)&server, len)

当你使用的是TCP,也就是SOCK_STREAM类型的socket时,才需要connect。

- 千里孤行

yanghehong 2010-01-28
  • 打赏
  • 举报
回复
看了一下帮助,对connect()也可以用在UDP Socket。
就当我前面的没有说:)


- 千里孤行
Wind_Runner 2010-01-28
  • 打赏
  • 举报
回复
udp套接口也可以有connect函数的, 是解决当目的主机不可达的时候内核通知进程的问题,例如icmp消息
yanghehong 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mediaworker 的回复:]
to 千里孤行,谢谢你的回答!
如果不需要 connect,那我怎样向指定的IP地址的某个端口发数据呢?
[/Quote]

用sendto()这个函数接口,有个目标地址参数:
ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);

或者sendmsg()

- 千里孤行
mediaWorker 2010-01-28
  • 打赏
  • 举报
回复
to 千里孤行,谢谢你的回答!
如果不需要 connect,那我怎样向指定的IP地址的某个端口发数据呢?

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧