我的任务是通过客户端的TCP连接接收数据,然后将相同的值连续发送回客户端。这是一个基本代码,但我只是确定p1 [i]是否与p [i]具有相同的值,并将接收到的数据发送回客户端,因为我无法在明天之前对其进行测试。我刚刚将客户端的通信部分包括在内,而不是建立连接。
int main(int argc , char *argv[])
{
WSADATA wsa;
SOCKET s , new_socket;
struct sockaddr_in server , client;
int c;
char iResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
char sendbuf [DEFAULT_BUFLEN];
int sendbuflen = DEFAULT_BUFLEN;
unsigned int i;
uint8_t* p;
uint8_t* p1;
int x=0;
int q=0;
size_t len;
p = (uint8_t*)recvbuf;
len= iResult/sizeof(uint8_t);
do
{
iResult = recv( new_socket, recvbuf, recvbuflen, 0);
{
for(i=0; i<len; i++)
{
p[i];
}
}
if( iResult == 0 )
{
wprintf(L"Connection closed\n");
}
else
{
wprintf(L"recv failed with error: %d\n", WSAGetLastError());
}
}
while(iResult > 0 );
// Send uint8_t back data to client
p1 = (uint8_t*)sendbuf;
iResult = send(new_socket, sendbuf, sendbuflen, 0);
{
for(q=0; q<len; q++)
{
p1[q] = p[q];
}
}
return 0;
closesocket(new_socket);
WSACleanup();
return 0;
}
答案 0 :(得分:2)
代码是否会将收到的数据发回?
不,它没有,因为它从不同的缓冲区发送,也因为它忽略了recv(),
返回的长度,所以它可以发送任意垃圾。
大多数代码都没有意义:
for(i=0; i<len; i++)
{
p[i];
}
这完全没有任何结果。
if( iResult == 0 )
{
wprintf(L"Connection closed\n");
}
else
{
wprintf(L"recv failed with error: %d\n", WSAGetLastError());
}
您正在打印错误消息,即使iResult > 0
,这意味着已收到数据并且没有错误。
for(q=0; q<len; q++)
{
p1[q] = p[q];
}
同样,这完全没有任何结果,因为你在退出方法之前就已经这样做了,当它中声明的所有变量无论如何都会消失。
答案 1 :(得分:2)
我的任务是通过客户端的TCP连接接收数据,然后将相同的值连续发送回客户端。
这可能是你的任务,但这不是你的代码实际做的事情。您的代码存在很多问题:
iResult
时, len
未初始化,因此recv()
之后的循环无效。循环本身没用,因为它实际上没有做任何事情。
recv()
如果收到字节则返回>0
,断开连接时返回0
,错误时返回-1
。您确实将>0
记录为错误。
在send()
报告错误/断开连接之前,您没有致电recv()
。您需要在接收循环内移动send()
。
在调用recvbuf
之前,您没有将任何数据从sendbuf
复制到send()
,因此您发送随机垃圾。您只有在调用recvbuf
后才会将数据从sendbuf
复制到send()
,但您仍在使用len
之前计算的无效recv()
值叫,所以现在你可能会破坏随机记忆。
您在致电return
或closesocket()
之前致电WSACleanup()
。
如果要做的只是在连接的生命周期内回显任何收到的数据,请尝试改为:
int main(int argc , char *argv[])
{
SOCKET new_socket;
int iResult, len;
char recvbuf[DEFAULT_BUFLEN];
char *p;
// establish connection ...
do
{
iResult = recv(new_socket, recvbuf, sizeof(recvbuf), 0);
if( iResult < 0 )
{
wprintf(L"recv failed with error: %d\n", WSAGetLastError());
break;
}
if( iResult == 0 )
{
wprintf(L"Connection closed\n");
break;
}
p = recvbuf;
len = iResult;
do
{
iResult = send(new_socket, p, len, 0);
if( iResult <= 0 )
{
wprintf(L"send failed with error: %d\n", WSAGetLastError());
break;
}
p += iResult;
len -= iResult;
}
while( len > 0 );
}
while (true);
closesocket(new_socket);
WSACleanup();
return 0;
}