我是一名新手/初学者程序员,在使一些简单的客户端/服务器 C 代码正常工作时遇到问题。我的最终目标是将方位角/仰角数据的“流”从服务器发送到客户端,然后在收到数据时转换该数据(它只是一个除法,但我真的不知道如何做到这一点任一)转换为云台单元的位置数据,然后将转换后的数据通过串行输出到云台。 (我可能稍后会回来询问这个问题......)
现在我只是想弄清楚如何发送和接收数据。我从这个网站获取了代码。 http://www.tenouk.com/Winsock/Winsock2example3.html 。我必须移动一些声明才能编译代码。
我在客户端电脑上使用Windows 7和VS2010 professional。客户端和服务器之间没有路由器(它们通过以太网直接连接)。
使用调试器,我发现我此时挂断了。
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("12.266.66.255");
clientService.sin_port = htons(55555);
if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
printf("Client: connect() - Failed to connect.\n");
WSACleanup();
return 0;
}
else
{
printf("Client: connect() is OK.\n");
printf("Client: Can start sending and receiving data...\n");
}
我总是收到“连接失败”消息,但我不知道为什么。我使用的是正确的主机IP地址(我在放在这里之前更改了它)。
如果这是一个不好的例子,我愿意从另一个例子开始。我已经尝试了网上常见的几个“echo”示例,并且遇到了类似的问题。如果有帮助的话,我也可以提供有关我的总体计划目标的更多信息。其余的客户端代码如下。我正在使用来自同一链接的服务器代码(声明已移动)。谢谢。
int main()
{
int m_socket;
struct sockaddr_in clientService;
int bytesSent;
int bytesRecv = SOCKET_ERROR;
// Be careful with the array bound, provide some checking mechanism...
char sendbuf[200] = "This is a test string from client";
char recvbuf[200] = "";
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Client: Error at WSAStartup().\n");
else
printf("Client: WSAStartup() is OK.\n");
// Create a socket
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
{
printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 0;
}
else
printf("Client: socket() is OK.\n");
// Connect to a server.
// Just test using the localhost, you can try other IP address
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("12.233.21.254");
clientService.sin_port = htons(55555);
if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
printf("Client: connect() - Failed to connect.\n");
WSACleanup();
return 0;
}
else
{
printf("Client: connect() is OK.\n");
printf("Client: Can start sending and receiving data...\n");
}
// Send and receive data.
// Receives some test string to server...
while(bytesRecv == SOCKET_ERROR)
{
bytesRecv = recv(m_socket, recvbuf, 200, 0);
if (bytesRecv == 0 || bytesRecv == WSAECONNRESET)
{
printf("Client: Connection Closed.\n");
break;
}
if (bytesRecv < 0)
return 0;
else
{
printf("Client: recv() is OK.\n");
printf("Client: Received data is: \"%s\"\n", recvbuf);
printf("Client: Bytes received is: %ld.\n", bytesRecv);
}
}
// Sends some test data to server...
bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0);
if(bytesSent == SOCKET_ERROR)
printf("Client: send() error %ld.\n", WSAGetLastError());
else
{
printf("Client: send() is OK - Bytes sent: %ld\n", bytesSent);
printf("Client: The test string sent: \"%s\"\n", sendbuf);
}
WSACleanup();
return 0;
}
最佳答案
你的原始代码(显然是在我更改了 IP 和端口之后)连接到我的网络服务器很好,但我确实对其进行了一些调整(如下)。
虽然可能有点多,CSocketServer包含大量经过尝试并证明正确的优秀 WinSock 代码。
无论如何,这段代码连接到我的本地网络服务器,发送了一个基本请求并收到了响应。
int WSATest()
{
// Initialize Winsock.
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR)
{
printf("Client: Error at WSAStartup().\n");
return 0;
}
// Create a socket
SOCKET m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
{
printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 0;
}
else {
printf("Client: socket() is OK.\n");
}
struct sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
clientService.sin_port = htons(9990);
//Connect to the remote peer:
if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
printf("Client: connect() - Failed to connect.\n");
WSACleanup();
return 0;
}
else
{
printf("Client: connect() is OK.\n");
printf("Client: Can start sending and receiving data...\n");
}
//Very, very basic HTTP request.
int iSendResult = send(m_socket, "GET / \n\n", 8, 0);
if(iSendResult == SOCKET_ERROR)
{
printf("Failed to send data, error %d.\n", WSAGetLastError());
return 0;
}
while(true)
{
char sRecvBuffer[200];
int iRecvResult = recv(m_socket, sRecvBuffer, sizeof(sRecvBuffer) - 1, 0);
if(iRecvResult <= SOCKET_ERROR)
{
printf("Failed to receive data, error %d.\n", WSAGetLastError());
break;
}
else if(iRecvResult == 0)
{
//Graceful disconnect.
break;
}
else {
//Be sure to terminate the buffer.
sRecvBuffer[iRecvResult] = '\0';
}
printf("Received: [%s] for [%d] bytes.\n", sRecvBuffer, iRecvResult);
}
WSACleanup();
return 0;
}
int main()
{
WSATest();
system("Pause");
}
关于客户端连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431314/