我正在开发我的Android应用程序的iOS版本,该应用程序不断通过常规TCP连接向服务器发送一些二进制数据。虽然 Java 代码工作正常,但我的纯 C 代码却不能 - 在第一组数据发送到服务器后连接中断。我设法使用 CFNetwork 框架重新实现 Java 解决方案,但我的 C 代码仍然是一个问题......
C 代码(删除错误检查和无趣代码):
mSocket = socket(AF_INET, SOCK_STREAM, 0);
//...
connect(mSocket, (struct sockaddr *)&sin, sizeof(sin));
int keepalive = 1;
int res = setsockopt(mSocket, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive,
sizeof(int));
int set = 1;
setsockopt(mSocket, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
unsigned char buffer* = //...;
int ret = send(mSocket, buffer, bufferLen, 0); //handshake with server, runs fine
while(/*there is new data*/) {
buffer = new_data(); //some fake method
ret = send(mSocket, buffer, bufferLen, 0); //On the second iteration
//write returns -1
}
但是,这个基于CFNetwork的Objective-C代码工作得很好...
Objective-C 代码:
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
host,
port,
&readStream,
&writeStream);
CFWriteStreamOpen(mServerWriteStream);
while(/*there is new data*/) {
NSData* data = //....
int wroteBytes = CFWriteStreamWrite(mServerWriteStream, [data bytes], [data length]);
}
所以我对我在 C 代码中做错了什么感到困惑,并将不胜感激任何提示
谢谢
如果您需要常规TCP连接,则需要使用此类协议创建套接字。而不是:
mSocket = socket(AF_INET, SOCK_STREAM, 0);
您应该将其创建为:
#include <netinet/in.h>
mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
在我的系统上,IPPROTO_TCP定义为 6 而不是 0。我怀疑你有类似的东西。
setsockopt() 必须在 connect() 之前执行,否则将被忽略。