作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习如何使用 win32 套接字 (winsock2) 的教程。我正在尝试创建一个连接到“本地主机”的简单套接字,但是当我尝试连接到本地主机(在函数 connect() 中)时,我的程序失败了。
我需要管理员权限才能连接到本地主机吗?也许这就是它失败的原因?也许我的代码有问题?我已经尝试了端口 8888 和 8000,但它们都失败了。
此外,如果我将端口更改为 80 并连接到 www.google.com,我可以连接,但我没有收到任何回复。那是因为我没有发送 HTTP 请求还是我想得到一些响应?
这是我的代码(删除了包含):
// Constants & Globals //
typedef unsigned long IPNumber; // IP number typedef for IPv4
const int SOCK_VER = 2;
const int SERVER_PORT = 8888; // 8888
SOCKET mSocket = INVALID_SOCKET;
SOCKADDR_IN sockAddr = {0};
WSADATA wsaData;
HOSTENT* hostent;
int _tmain(int argc, _TCHAR* argv[])
{
// Initialise winsock version 2.2
if (WSAStartup(MAKEWORD(SOCK_VER,2), &wsaData) != 0)
{
printf("Failed to initialise winsock\n");
WSACleanup();
system("PAUSE");
return 0;
}
if (LOBYTE(wsaData.wVersion) != SOCK_VER || HIBYTE(wsaData.wVersion) != 2)
{
printf("Failed to load the correct winsock version\n");
WSACleanup();
system("PAUSE");
return 0;
}
// Create socket
mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (mSocket == INVALID_SOCKET)
{
printf("Failed to create TCP socket\n");
WSACleanup();
system("PAUSE");
return 0;
}
// Get IP Address of website by the domain name, we do this by contacting(??) the Domain Name Server
if ((hostent = gethostbyname("localhost")) == NULL) // "localhost" www.google.com
{
printf("Failed to resolve website name to an ip address\n");
WSACleanup();
system("PAUSE");
return 0;
}
sockAddr.sin_port = htons(SERVER_PORT);
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.S_un.S_addr = (*reinterpret_cast <IPNumber*> (hostent->h_addr_list[0]));
// sockAddr.sin_addr.s_addr=*((unsigned long*)hostent->h_addr); // Can also do this
// ERROR OCCURS ON NEXT LINE: Connect to server
if (connect(mSocket, (SOCKADDR*)(&sockAddr), sizeof(sockAddr)) != 0)
{
printf("Failed to connect to server\n");
WSACleanup();
system("PAUSE");
return 0;
}
printf("Got to here\r\n");
// Display message from server
char buffer[1000];
memset(buffer,0,999);
int inDataLength=recv(mSocket,buffer,1000,0);
printf("Response: %s\r\n", buffer);
// Shutdown our socket
shutdown(mSocket, SD_SEND);
// Close our socket entirely
closesocket(mSocket);
// Cleanup Winsock
WSACleanup();
system("pause");
return 0;
}
最佳答案
因为您愿意使用 TCP 协议(protocol) connection based您将需要一个通信对象,例如监听端口 8888 的应用程序来响应您的连接启动请求(SYN-TCP 术语中的数据包)
您可以使用 unix 工具 netcat (其他操作系统也可用)无需管理员权限即可执行此操作...
nc -l 8888
... 在本地机器的 8888 端口打开一个监听套接字
但是,在 unix 系统上,您不允许监听所谓的 well known ports。没有管理员权限。
有关更多信息,请阅读 TCP Connection Life-Cycle
关于c++ - 为什么一个简单的套接字不能连接到本地主机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8277493/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!