Winsock 服务器消息未显示在客户端终端上
Winsock server message isn't showing on client side terminal
我创建了一个简单的 TCP 服务器,监听 8080 端口,一旦建立连接,它就会向客户端发送一条消息。这是代码。
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996)
int main(int argc, char* argv[]) {
WSADATA wsa;
SOCKET s, new_socket;
int c;
int ret;
struct sockaddr_in server, client;
char* message = "Thank you for connecting to us but i got to go\n";
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
printf("Failed to initialize Winsock : %d", WSAGetLastError());
return 1;
}
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
printf("Error creating socket : %d", WSAGetLastError());
}
server.sin_family = AF_INET;
server.sin_port = htons(8080);
server.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("Error binding socket : %d\n", WSAGetLastError());
exit(EXIT_FAILURE);
}
listen(s, 3);
puts("Listening for incoming connection\n");
c = sizeof(struct sockaddr_in);
while (new_socket = accept(s, (struct sockaddr*)&client, &c) != INVALID_SOCKET) {
puts("Connection established\n");
send(new_socket, message, strlen(message), 0);
}
if (new_socket == INVALID_SOCKET) {
printf("Connection failed : %d", WSAGetLastError());
return 1;
}
closesocket(s);
WSACleanup();
return 0;
}
当我运行这样时,服务器运行正常。我打开另一个终端并打开 telnet 并尝试连接到 8080 端口上的服务器。这是客户端。
Welcome to Microsoft Telnet Client
Escape Character is 'CTRL+]'
Microsoft Telnet> open localhost 8080
Connecting To localhost...
这是服务器端。
Listening for incoming connection
Connection established
但即使在服务器说连接已建立之后,客户端仍停留在 "Connecting to localhost"。我发送消息 "Thank you for connecting to us but i got to go\n" 但它没有显示在客户端。可能有什么问题?
看起来,这是一个愚蠢的错误。
while (new_socket = accept(s, (struct sockaddr*)&client, &c) != INVALID_SOCKET)
因为我没有在 new_socket = accept(s, (struct sockaddr*)&client, &c 初始化 new_socket
后加上另一个括号,不等式被应用到 accept
函数return。
正确的语法是
while ((new_socket = accept(s, (struct sockaddr*)&client, &c)) != INVALID_SOCKET)
我创建了一个简单的 TCP 服务器,监听 8080 端口,一旦建立连接,它就会向客户端发送一条消息。这是代码。
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996)
int main(int argc, char* argv[]) {
WSADATA wsa;
SOCKET s, new_socket;
int c;
int ret;
struct sockaddr_in server, client;
char* message = "Thank you for connecting to us but i got to go\n";
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
printf("Failed to initialize Winsock : %d", WSAGetLastError());
return 1;
}
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
printf("Error creating socket : %d", WSAGetLastError());
}
server.sin_family = AF_INET;
server.sin_port = htons(8080);
server.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("Error binding socket : %d\n", WSAGetLastError());
exit(EXIT_FAILURE);
}
listen(s, 3);
puts("Listening for incoming connection\n");
c = sizeof(struct sockaddr_in);
while (new_socket = accept(s, (struct sockaddr*)&client, &c) != INVALID_SOCKET) {
puts("Connection established\n");
send(new_socket, message, strlen(message), 0);
}
if (new_socket == INVALID_SOCKET) {
printf("Connection failed : %d", WSAGetLastError());
return 1;
}
closesocket(s);
WSACleanup();
return 0;
}
当我运行这样时,服务器运行正常。我打开另一个终端并打开 telnet 并尝试连接到 8080 端口上的服务器。这是客户端。
Welcome to Microsoft Telnet Client
Escape Character is 'CTRL+]'
Microsoft Telnet> open localhost 8080
Connecting To localhost...
这是服务器端。
Listening for incoming connection
Connection established
但即使在服务器说连接已建立之后,客户端仍停留在 "Connecting to localhost"。我发送消息 "Thank you for connecting to us but i got to go\n" 但它没有显示在客户端。可能有什么问题?
看起来,这是一个愚蠢的错误。
while (new_socket = accept(s, (struct sockaddr*)&client, &c) != INVALID_SOCKET)
因为我没有在 new_socket = accept(s, (struct sockaddr*)&client, &c 初始化 new_socket
后加上另一个括号,不等式被应用到 accept
函数return。
正确的语法是
while ((new_socket = accept(s, (struct sockaddr*)&client, &c)) != INVALID_SOCKET)