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

社区

通信技术 帖子详情 调用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失败的情况?多谢各位大侠!

...全文

3796 12 打赏 收藏 调用socket send()返回失败是怎么回事? 我的代码是这样写的: 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()函数的调用一次成功一次失败,成功时返回发送的字节数 复制链接

扫一扫 分享 转发到动态 举报

写回复 配置赞助广告取 消

确 定

用AI写文章 12 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 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地址的某个端口发数据呢? Socket编程例子 Socket编程例子 socket的write/send还是是否是线程安全? 在多线程的网络服务器程序中, 对同一个客户端多线程同时发送数据是经常可能发生的事情, 也就是有可能会多

线程的对一个fd调用send/write, 那么这种操作是否需要加锁?并发写套接字是否导致系统缓冲区数据混乱呢? 网上搜

了下,有人说可以写,有人说不能,linux man page也没有说明。 看来需要写程序测试。 写了个server的代码进行

测试。

10个线程同时对一个fd进行 socket的send系统调用 Linux下面socket编程的非阻塞TCP研究

tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.

不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.

阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回 socket的send函数返回-1(WSAGetLastError返回10057)? 问题现象:今天写一个socket服务端,客户端connect成功,服务端accept成功,能接收到服务端数据,但就是发送给客户端数据时send返回-1。

网上查了查用 WSAGetLastError

ret1= send(sd, buf, 4, 0);

ret2 =WSAGetLastError();

ret1返回-1,ret2返回10057,网上说10057是未连接,但的确是连接了,... socket send返回值_Linux网络编程中socket常见错误分析 socket错误码:EINTR: 4阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。只能针对阻塞模式的socket。读,写阻塞的socket时,-1返回,错误号为INTR。另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。如果recv的返回值为0,那表明连接已经断开,接收操作也应该结束。ETIMEOUT:110...

通信技术

4,389

社区成员

28,915

社区内容

发帖 与我相关 我的任务 通信技术 通信技术相关讨论 复制链接

扫一扫 分享 确定 社区描述 通信技术相关讨论 社区管理员

加入社区

获取链接或二维码

近7日

近30日

至今

加载中

查看更多榜单

社区公告

暂无公告 试试用AI创作助手写篇文章吧

+ 用AI写文章