我知道TCP中没有数据包概念,因为它是一个流套接字,例如,如果我有一个2000字节的数据包,例如2000'a',而我的默认缓冲区大小是1024,则应该发送两次,两次收到?
因此对于send()函数,
iResult = send(s, sendbuf, packet_size, 0);
对于第二个参数,我应该输入什么?发送缓冲区字符指针(分配了1024个字节)还是数据包字符指针(分配了2000个字节),它将自动为我处理?
对于recv()阻塞函数,我应该将缓冲字符指针指向第二个参数还是数据包一个?
对于标题,我的朋友建议我添加4个字节的标题以存储数据包信息,例如。数据包的序列号和大小,如何实现?谢谢
@乔吉,谢谢!我也想问一下,如果我不执行部分写操作,而while循环中的发送速率非常快(无睡眠),那么服务器端会出现错误/丢失吗?对于recv()
SOCKET newsfd;
bind(s, (struct sockaddr *)ReceiverSocket, sizeof(struct sockaddr_in));
if (strcmp(protocol, "tcp") == 0 || strcmp(protocol, "TCP") == 0){
listen(s, 1);
newsfd = accept(s, 0, 0);
}
//*** Create Update Display Thread
std::thread th(Function_packet_transmission_display, update_interval, (char*) "recv");
//*** Receive Data//*** Set Jitter
long time_old = 0, time_new = 0, time_start = 0;
long float jitter_new = 0, jitter_old = 0;
long long temp_accubyte = 0, temp_pktnum = 0; //testing
char *recvbuf = new char[buffer_size];
long long next_seq_num = 1; int retVal;
do{
if (strcmp(protocol, "tcp") == 0 || strcmp(protocol, "TCP") == 0){
retVal = recv(newsfd, recvbuf, packet_size, 0);
if ((retVal == SOCKET_ERROR) || (retVal == 0)){
printf("\nreturn fail code:%i\n", WSAGetLastError());
closesocket(s);
WSACleanup();
lck.lock();
Ended = true;
lck.unlock();
return 0;
}
}
else if (strcmp(protocol, "udp") == 0 || strcmp(protocol, "UDP") == 0){
int fromlen = (int)sizeof(struct sockaddr_in);
retVal = recvfrom(s, recvbuf, packet_size, 0, (struct sockaddr *)ReceiverSocket, &fromlen);
}
//testing
temp_accubyte += retVal;
temp_pktnum++;//TEST
//printf("\racc: %lld %lld - ", temp_accubyte, temp_pktnum);
//if (temp_pktnum==100000) printf("\nReach 100000\n", temp_accubyte, temp_pktnum);
if (timer == NULL){
timer = new ES_FlashTimer();
}
如果我有一个2000字节的数据包,说2000'a',
你不知道 您有一条2000字节的消息。
我的默认缓冲区大小是1024
不太可能。至少是8192,可能是数千K。
然后应该发送两次
至少。
并收到两次?
至少。
对于第二个参数,我应该输入什么?
您要发送的消息的大小:在这种情况下,为2000。
发送缓冲区字符指针并分配了1024个字节
不。
还是一个2000字节的包字符指针,它将自动为我处理?
是的。
对于recv()阻塞函数,我应该将缓冲字符指针指向第二个参数还是数据包一个?
我无法说清楚这一点,但您应该将其尽可能多地放入缓冲区并循环,直到获得完整的消息为止。
对于标题,我的朋友建议我添加4个字节的标题以存储数据包信息,例如。包的序号和大小,如何实现!
您实际上并不需要序列号,但是消息大小是个好主意。只需将其粘贴在消息的前面即可。不清楚这里的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句