当前位置: 技术问答>linux和unix
如何在数据长度不确定的情况下,准确的接受一个TCP数据报
来源: 互联网 发布时间:2016-03-14
本文导语: 客户端与服务器建立一个TCP连接,然后发送一个变长的TCP数据请求给服务器,然后服务器根据这个请求做相应的逻辑处理。 我现在的问题是,TCP是一个基于流的协议,譬如read(),recv()系统调用都必须使用确定的长度作...
客户端与服务器建立一个TCP连接,然后发送一个变长的TCP数据请求给服务器,然后服务器根据这个请求做相应的逻辑处理。
我现在的问题是,TCP是一个基于流的协议,譬如read(),recv()系统调用都必须使用确定的长度作为参数,如果长度参数n大于发送过来的数据报的话,那么进程就会一直阻塞,如果使用recv的非阻塞模式调用的话,那么有可能在数据报还没有到来之前recv就返回来了。请问,如何解决这个问题?长度参数n又如何确定呢?
我现在的问题是,TCP是一个基于流的协议,譬如read(),recv()系统调用都必须使用确定的长度作为参数,如果长度参数n大于发送过来的数据报的话,那么进程就会一直阻塞,如果使用recv的非阻塞模式调用的话,那么有可能在数据报还没有到来之前recv就返回来了。请问,如何解决这个问题?长度参数n又如何确定呢?
|
================================
就是发送的时候是先发个后续报文的长度,然后在发报文体
这样接收的时候首先接收报文长度,然后在根据这个长度来读取固定长度的报文体。
int tcp_accept(int socketid){
int iAcceptedID;
struct linger TimeOut;
char caIP[4*4];
unsigned int iLength;
struct sockaddr_in stSockAddr;
do {
iLength=sizeof(stSockAddr);
iAcceptedID = accept(socketid,(struct sockaddr*)&stSockAddr,
(unsigned int *)&iLength);
if (iAcceptedID