Socket的udp上传recvfrom单独取一个线程的有关问题
Socket的udp上传recvfrom单独取一个线程的问题?
各位大虾们,最近在写socket的udp的上传程序。现在遇到一个问题。
当使用sendto和recvfrom在同一个线程中时,程序完全没有问题。这样必须倒带数据发完了才能接收数据。到数据比较大时,程序就收不到服务器的应答包了(我上传数据的时候只要超过了17k就收不全数据了)。我想可能是没有及时对服务器的应答包做及时的处理导致丢包了。
现在我把sendto 和recvfrom写在两个线程里面,程序一运行就启动recvfrom函数。但是现在就收不到服务器的应答数据包了。我已经使用了bind了。附上部分代码:
麻烦各位大大们,看看是什么问题。服务器那边应该是没有问题的,因为已经可以收数据了。
请各位大大多多指点啊。。。。
------解决方案--------------------
先用抓包工具看看有数据包到达客户端没?
------解决方案--------------------
加上事件同步,否则线程执行的顺序是不定的
------解决方案--------------------
线程同步。
------解决方案--------------------
发送端循环里Sleep一会呢
------解决方案--------------------
改用select模型吧
------解决方案--------------------
你每使用一次SENDTO发送的数据是有限的,网络的MTU只有1498字节(没记错的话),所以你每SENDTO一次就必须等RECVFROM有回应之后才能SENDTO第二次,你自己应该有个应答机制,否则你传的数据始终是有问题的,虽然数据可以传输。数据量一大肯定就出问题了
各位大虾们,最近在写socket的udp的上传程序。现在遇到一个问题。
当使用sendto和recvfrom在同一个线程中时,程序完全没有问题。这样必须倒带数据发完了才能接收数据。到数据比较大时,程序就收不到服务器的应答包了(我上传数据的时候只要超过了17k就收不全数据了)。我想可能是没有及时对服务器的应答包做及时的处理导致丢包了。
现在我把sendto 和recvfrom写在两个线程里面,程序一运行就启动recvfrom函数。但是现在就收不到服务器的应答数据包了。我已经使用了bind了。附上部分代码:
- C/C++ code
recvfrom: struct sockaddr_in add2; int iLen2 =sizeof(add2); // ZeroMemory(&add2,iLen2); add2.sin_family=AF_INET; add2.sin_port=htons(8080); add2.sin_addr.s_addr = inet_addr("127.0.0.1"); struct sockaddr_in add; int iLen =sizeof(add); add.sin_family=AF_INET; add.sin_port=htons(60000); ///server的监听端口 add.sin_addr.s_addr = inet_addr("222.35.136.224"); SOCKET hSocket = socket(AF_INET, SOCK_DGRAM, 0); if (hSocket == INVALID_SOCKET) { AfxMessageBox(_T("socked failed")); WSACleanup(); return 0; } if(bind(hSocket, (struct sockaddr*)&add2, iLen2)) { CString str; str.Format(_T("recieve error: %d\n"), WSAGetLastError()); AfxMessageBox(str); return 0; } char recvBuf[1024] = {0}; int dwRecv = 0; while(1) { dwRecv = recvfrom(hSocket, recvBuf , 1024, 0, (struct sockaddr*)&add, &iLen); if(dwRecv == SOCKET_ERROR) { CString str; str.Format(_T("recieve error: %d\n"), WSAGetLastError()); AfxMessageBox(str); break; return 0; } sendto: struct sockaddr_in add; int iLen =sizeof(add); ZeroMemory(&add,iLen); add.sin_family=AF_INET; add.sin_port=htons(60000); ///server的监听端口 add.sin_addr.s_addr = inet_addr("222.35.136.224"); SOCKET hSocket = socket(AF_INET, SOCK_DGRAM, 0); if (hSocket == INVALID_SOCKET) { AfxMessageBox(_T("socked failed")); WSACleanup(); dlg->m_bSuccess =0; dlg->UpdateList(); return dlg->m_bSuccess; } DWORD dwSend2=0,dwTemp2=0; char* fBuf = fileBuff; DWORD fSize = dlg->m_dwFileSize; DWORD dTemp = 0; // int iPack = 0; while(fSize) { dwSend2 = sendto(hSocket, fBuf+dwTemp2, min(fSize,1000), 0, (struct sockaddr*)&add, iLen); //send printf("send data to server:-----start-----\r\n%s\r\n------end------\r\n", fBuf+dwTemp2); if(dwSend2 == SOCKET_ERROR) { CString str; str.Format(_T("Error on send file %d\n"), WSAGetLastError()); AfxMessageBox(str); dlg->m_bSuccess =0; dlg->UpdateList(); return dlg->m_bSuccess; }
麻烦各位大大们,看看是什么问题。服务器那边应该是没有问题的,因为已经可以收数据了。
请各位大大多多指点啊。。。。
------解决方案--------------------
先用抓包工具看看有数据包到达客户端没?
------解决方案--------------------
加上事件同步,否则线程执行的顺序是不定的
------解决方案--------------------
线程同步。
------解决方案--------------------
发送端循环里Sleep一会呢
------解决方案--------------------
改用select模型吧
------解决方案--------------------
你每使用一次SENDTO发送的数据是有限的,网络的MTU只有1498字节(没记错的话),所以你每SENDTO一次就必须等RECVFROM有回应之后才能SENDTO第二次,你自己应该有个应答机制,否则你传的数据始终是有问题的,虽然数据可以传输。数据量一大肯定就出问题了