socket编程,send recv函数 非诚勿扰啊
发布网友
发布时间:2023-09-21 05:58
我来回答
共3个回答
热心网友
时间:2024-11-17 04:38
这取决于你使用的协议。
一般使用SOCKET都是使用TCP协议socket(AF_INET, SOCK_STREAM, 0),或者是UDP协议socket(AF_INET, SOCK_DGRAM, 0).当然还有原始套接口和UNIX域协议,这个就不扯远了。
如果是TCP,系统自动完成工作有:发送,对方接受,对方返回确认。如果第一次发送失败,会自动重传直到确实无法发送到目的地(这个依套接口选项设定,不扯太远)。
如果是UDP,发送方只把数据包送出,不重传,不确认,也就是接受方不返回确认信息。
至于你这个问题“现在是send了100个1k字节的包,不知道什么时候可以停止recv做别的事”,这个问让我有点疑惑,因为什么时候停止recv这要看编程者的意愿,因为你是发送了100个1K包,那么你连续调用100次recv,如果你不设置非阻塞式I/O,则在100个包到达之前,你的recv不会停止。
另外我设想另一种情况,也可能是你想要的答案:
因为100个包全部接受到可能存在风险,如果你调用100次recv,如果其中丢失了1个包(UDP风险更大,TCP虽然会从传,但也只是会尝试几次),那么你的进程可能会永远阻塞在recv中,一般的做法是:将套接口设置为非阻塞式,用select函数给套接口加上限时,如果超过规定的时间没有收到100个包,则进行错误处理。
热心网友
时间:2024-11-17 04:38
一般是写一个线程专门处理 recv
while(true)
{
recv();
...
}
如果不用多线程,就不用想做别的事。
另外,不必要考虑什么重传。客户端,服务端都要根据recv的内容来决定干什么。
停止 recv,完全可以按自己的设计思路做,比如,recv到一个"end"字符串时,就停止。然后做其它事情。
热心网友
时间:2024-11-17 04:38
大概想到的方案有:
异步
回调
多线程