18,356
社区成员
发帖
与我相关
我的任务
分享
// Test0127.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "winsock2.h"
#include "stdlib.h"
#pragma comment(lib, "ws2_32.lib")
class CWSAInit
{
public:
CWSAInit()
{
WSADATA wsaData;
m_bFailed = WSAStartup(MAKEWORD(2, 2), &wsaData) != 0;
}
~CWSAInit()
{
WSACleanup();
}
BOOL Failed() const { return m_bFailed; }
private:
BOOL m_bFailed;
};
int main(int argc, char* argv[])
{
CWSAInit wsa;
SOCKET sock = INVALID_SOCKET;
struct sockaddr_in sa;
struct hostent *he;
int nRet;
if (wsa.Failed())
{
return -1;
}
// initialize socket
he = gethostbyname("192.168.1.200"); // 地址
if (he == NULL)
{
return -1;
}
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET)
{
return -1;
}
// set connect timeout
timeval tvOld, tvNew;
int ntvlen = sizeof timeval;
tvNew.tv_sec = 3; // 3秒
tvNew.tv_usec = 0;
if (getsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tvOld, &ntvlen) == SOCKET_ERROR)
{
return -1;
}
if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tvNew, sizeof timeval) == SOCKET_ERROR)
{
return -1;
}
if (getsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tvOld, &ntvlen) == SOCKET_ERROR) // 读出来的 tvOld.tv_usec 不为 0?
{
return -1;
}
printf("connecting...\n");
// connect
sa.sin_family = AF_INET;
sa.sin_port = htons(80); // 端口
sa.sin_addr = *((struct in_addr *)he->h_addr);
nRet = connect(sock, (struct sockaddr *)&sa, sizeof(sockaddr)); // 应只在3秒内尝试连接
if (nRet == SOCKET_ERROR)
{
printf("connect error!\n");
}
else
{
printf("connect ok!\n");
}
closesocket(sock);
system("pause");
return 0;
}