您好,我是套接字编程的新手,我正在尝试使用 http://www.binarytides.com/winsock-socket-programming-tutorial/ 教程中的以下代码
我正在尝试连接到服务器,并且我使用的是 google 的 IP 地址。这是代码:
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
int main(int argc , char *argv[])
{
WSADATA wsa;
SOCKET s;
struct sockaddr_in server;
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Failed. Error Code : %d",WSAGetLastError());
return 1;
}
printf("Initialised.\n");
//Create a socket
if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
{
printf("Could not create socket : %d" , WSAGetLastError());
}
printf("Socket created.\n");
server.sin_addr.s_addr = inet_addr("74.125.224.72");
server.sin_family = AF_INET;
server.sin_port = htons(80);
//Connect to remote server
if (connect(s, (struct sockaddr *)&server , sizeof(server)) < 0)
{
puts("connect error");
return 1;
}
puts("Connected");
return 0;
}
到目前为止可以创建套接字但我无法连接到服务器。更具体地说,我总是退出并具有以下内容:
程序“[2060] SocketCTest.exe: Native”已退出,代码为 1 (0x1)。
即使我在返回前设置了一个断点。
最佳答案
没有错误。我已经在我的计算机上尝试过,但连接返回错误 (WSAETIMEDOUT
)。我不确定我的电脑、代理、防火墙等是否有网络设置;或者该 google 主机配置为不接受直接套接字连接。
无论如何,这里是您的代码并进行了一些小的调整:
#include <stdio.h>
#include <conio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") //Winsock Library
int main(int argc, char *argv[])
{
WSADATA wsa;
SOCKET s;
struct sockaddr_in server;
char c = 0;
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
{
printf("Failed. Error Code : %d.\nPress a key to exit...", WSAGetLastError());
c = getch();
return 1;
}
printf("Initialised.\n");
//Create a socket
if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("Could not create socket : %d.\n", WSAGetLastError());
WSACleanup();
c = getch();
return 1;
}
printf("Socket created. Connecting...\n");
memset(&server, 0, sizeof server);
server.sin_addr.s_addr = inet_addr("74.125.224.72");
server.sin_family = AF_INET;
server.sin_port = htons(80);
//Connect to remote server
if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
{
printf("Connect error:%d.\nPress a key to exit...", WSAGetLastError());
closesocket(s);
WSACleanup();
c = getch();
return 1;
}
puts("Connected.\nPress a key to exit...");
closesocket(s);
WSACleanup();
c = getch();
return 0;
}
现在,如果您想查看实际连接的代码,我建议您使用 localhost
(127.0.0.1
) 而不是 74.125.224.72
,以及端口 3389
(它是远程桌面服务器 (RDP) 端口,如果您的计算机上配置并运行了 RDP)而不是 80
;或者,如果您的计算机上运行着 Web 服务器(IIS?),您可以让 80
。
要获取在您的计算机上运行的服务器程序列表,请运行以下命令:
`netstat -an | findstr LISTEN`
这将以这种形式输出一堆行(我们关心的是)(这是对应于上面的 RDP 示例的行):
`TCP 127.0.0.1:3389 0.0.0.0:0 LISTENING`
关于windows下C套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323015/