我创建一个java套接字服务器和c套接字客户端,这里是代码
Java Socket Server:
int Send_Request(String s) {
try {
os = socket.getOutputStream();
os.write(s.getBytes());
os.flush();
Log.d(tag,"Data = " + s);
return 0;
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e(tag,"Send Request Error");
return -1;
}
C套接字客户端:
void* recv_request()
{
int i,in;
char buf[1024];
while(1)
{
if ( ( in = read(sockfd, buf, strlen(buf)) ) != -1 )
{
LOGD("Received = %s ...",buf);
sendServerCutText(buf);
memset(buf,0,strlen(buf));
}
}
}
问题是..当我从服务器发送时,它在flush()上阻塞,c客户端在调用另一个Send_Request之前无法接收。
问题在哪里?
答案 0 :(得分:3)
存在一个概念性问题。您认为TCP是面向消息的(发送具有指定长度的消息)。它不是那样的,它只提供 stream 字节。
对于发送具有指定长度的消息,常见的技术是首先发送长度(以固定长度编码,例如以网络字节顺序的4字节整数),然后发送实际消息。
还有一个实现问题,read的第三个参数应该是最大读取长度,应该是1024,对非初始化的本地char数组执行strlen
显然是未定义的行为。