一个task中可以连接两个tcp socket,向两个不同的地址发送数据吗?为什么我在一个task中创建了两个socket,会出现停止现象,就是不在接收数据,有时候几十秒停止,有时候几分钟,是什么问题,求指教。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
一个task中可以连接两个tcp socket,向两个不同的地址发送数据吗?为什么我在一个task中创建了两个socket,会出现停止现象,就是不在接收数据,有时候几十秒停止,有时候几分钟,是什么问题,求指教。
请问您的硬件平台是什么,用的哪款芯片,软件版本是什么,是TI NDK中的例程还是自己开发的程序
2个socket走的是1个SGMII口还是2个SGMII口,数据包类型是什么样的,流量多少?
以上信息会有助于我们帮您分析解决。谢谢
您好,
我的硬件平台是TMS320C6678l,软件版本是CCS6.1,MCSDK版本是2.1.2.5,NDK版本是2.24,程序是在NDK中的例程上面自己修改的。2个socket走的是一个千兆网口。dsp上程序如下,创建了两个socket连接tcp和tcp2,发送缓冲区和接收缓冲区大小都为64000,接收采用的是stcp,发送采用的是stcp2,程序运行2分钟左右卡住(recv函数还在接收数据,每次接收1460,但速度非常慢,隔几秒才接收一次,像卡住一样),如果将send(stcp2, addr, 5000, 0)中的5000改成50000,整个程序运行十几秒就会卡住。
void ndk_main_receiveTsk(UInt32 a,UInt32 b,UInt32 c)
{
uint totalBytes = 0;
int i;
char *addr = (char*) 0x9ad00000; //接收缓冲区起始地址
struct timeval to;
struct sockaddr_in sin1;
SOCKET stcp = INVALID_SOCKET;
int error;
struct timeval to2;
struct sockaddr_in sin2;
SOCKET stcp2 = INVALID_SOCKET;
/* Allocate the file environment for this task */
fdOpenSession(TaskSelf());
bzero(&sin1, sizeof(struct sockaddr_in));
sin1.sin_family = AF_INET;
sin1.sin_addr.s_addr = inet_addr(IPADDR_STRING);
sin1.sin_port = htons(8899);
stcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (stcp == INVALID_SOCKET) {
printf("receive task Failed to create socket, %d\n", fdError());
goto leave;
}
printf("receive task socket create success\n ");
to.tv_sec = 60; //s
to.tv_usec = 0; //ms
setsockopt(stcp, SOL_SOCKET, SO_SNDTIMEO, &to, sizeof(to));
setsockopt(stcp, SOL_SOCKET, SO_RCVTIMEO, &to, sizeof(to));
for (;;) {
/* Connect socket */
if (connect(stcp, (PSA) &sin1, sizeof(struct sockaddr_in)) < 0) {
printf("receive task connect PC failed\n");
TaskSleep(500);
} else
break;
}
bzero(&sin2, sizeof(struct sockaddr_in));
sin2.sin_family = AF_INET;
sin2.sin_addr.s_addr = inet_addr(IPADDR_STRING2);
sin2.sin_port = htons(8877);
stcp2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (stcp2 == INVALID_SOCKET) {
printf("receive task Failed to create socket, %d\n", fdError());
goto leave;
}
printf("receive task socket create success\n ");
to2.tv_sec = 60; //s
to2.tv_usec = 0; //ms
setsockopt(stcp2, SOL_SOCKET, SO_SNDTIMEO, &to2, sizeof(to2));
setsockopt(stcp2, SOL_SOCKET, SO_RCVTIMEO, &to2, sizeof(to2));
for (;;) {
/* Connect socket */
if (connect(stcp2, (PSA) &sin2, sizeof(struct sockaddr_in)) < 0) {
printf("receive task connect PC failed\n");
TaskSleep(500);
} else
break;
}
while (1) {
totalBytes = 0;
while (totalBytes < 100000) {
i = recv(stcp, addr + 100000 + totalBytes, 100000 - totalBytes,
0);
totalBytes = totalBytes + i;
}
send(stcp2, addr, 5000, 0);
}//end while(1)
leave:
// We only get here on an error - close the sockets
if (stcp != INVALID_SOCKET) {
fdClose(stcp);
}
fdCloseSession(TaskSelf());
TaskDestroy(TaskSelf());
}