socket编程 一直connect不上

时间:2022-10-13 23:55:30



#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <process.h>
#include "malloc.h"
#include "winsock2.h"
#include <stdlib.h>
#include <conio.h>

int open_clientfd(const char* hostname, int port) 

WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) 
{
printf("Error: %d\n", WSAGetLastError());
return -1;
}                                      

if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) 
{   
printf("Error: %d\n", WSAGetLastError());
WSACleanup( );
return -1; 
}

  int ClientSock; 
  struct hostent* hp; 
  struct sockaddr_in serveraddr;  
  if ((ClientSock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    return -1; /* check errno for cause of error */ 
  
   /* Fill in the server's IP address and port */ 
  if ((hp = gethostbyname(hostname)) == NULL) 
    return -2; /* check h_errno for cause of error */

  memcpy(&serveraddr.sin_addr,hp->h_addr_list,hp->h_length);

//   serveraddr.sin_addr.S_un.S_addr=inet_addr(((const char*)hp->h_addr[0]));
  //serveraddr.sin_addr.S_un.S_addr =((LPIN_ADDR)hp->h_addr)->S_un.S_addr;
  serveraddr.sin_family = AF_INET; 
  serveraddr.sin_port = htons(port);
 //感觉这几句有问题。。。
    int result;
result = connect(ClientSock, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));

if (0 != result)
{
    printf("Error: %d\n", WSAGetLastError());
WSACleanup();
}

  return ClientSock; 

int main()
{
   char sendbuf[]="GET / HTTP/1.1\r\nHost:localhost\r\nConnection:closeUser-agent:MyApp/0.1Accept-language:zh-cn\r\n\r\n";
   char recvBuf [6000];
   int ClientSock = open_clientfd("www.baidu.com", 65000);

   int result = send (ClientSock , sendbuf , strlen(sendbuf) , 0);
   memset(recvBuf,0x00,sizeof(recvBuf));

   int recvresult = recv(ClientSock, recvBuf, 6000, 0);
   
  printf("%s",recvBuf);

  closesocket(ClientSock);
  WSACleanup();
  return 0;
}




我想通过sent 然后得到 一个网页的信息,可是我怎么也连接不上这个网页,
我只能通过 域名来访问网页,请高手上述程序为什么connect不上。。。

16 个解决方案

#1


connect 错误码 10060

#2


顶顶 别人来解决

#3


看到这个问题很感兴趣,所以研究了一会儿,首先说下我觉得出现的问题:
1 gethostbyname返回来的是不是正确的信息,lz怀疑这点应该是正确的,我觉得都没有连上百度怎么获取他的IP等信息?
2 端口号不对,根据我的经验,C端和S端port必须相同,才能连接的上,百度的端口号是65000吗?

基于以上考虑,修改
memcpy(&serveraddr.sin_addr,hp->h_addr_list,hp->h_length);
把这行替换成:
serveraddr.sin_addr.S_un.S_addr = inet_addr("220.181.6.18"); //百度的ip,ping后知道的
然后再运行了下,还是10060错误

接下来改端口,但是在网上没有查到百度的端口号,就随便猜了一个80
结果就没有出现错误了,这么说是不是就练到百度上去了?

最后recvresult值为1238960

#4


刚才和我的同事讨论了下,分享一下获取网站IP和port的方法
1 打开cmd
2 ping www.baidu.com //就是你想访问的网页,百度的为220.181.6.18
3 然后打开一个百度网页  
4 在cmd里面输入natstat -an,就可以所有ip对应的端口号了,你找到220.181.6.18,发现后面跟的是80

所以事实上百度的端口就是80

#5



#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <process.h>
#include "malloc.h"
#include "winsock2.h"
#include <stdlib.h>
#include <conio.h>
#pragma comment(lib,"Ws2_32.lib")

int open_clientfd(const char* hostname, int port) 

    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD( 1, 1 );    
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) 
    {
        printf("Error: %d\n", WSAGetLastError());
        return -1;
    }                                      
    
    if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) 
    {   
        printf("Error: %d\n", WSAGetLastError());
        WSACleanup( );
        return -1; 
    }

  int ClientSock; 
  struct hostent* hp; 
  struct sockaddr_in serveraddr;  
  if ((ClientSock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    return -1; /* check errno for cause of error */ 
  
   /* Fill in the server's IP address and port */ 
  if ((hp = gethostbyname(hostname)) == NULL) 
    return -2; /* check h_errno for cause of error */

  //// 这里转换的ip地址是错误的
  ////memcpy(&serveraddr.sin_addr,hp->h_addr_list,hp->h_length);
  ////

  serveraddr.sin_family = AF_INET; 
  serveraddr.sin_port = htons(port); //感觉这几句有问题。。。
  //// 设置ip地址
  serveraddr.sin_addr.S_un.S_addr=inet_addr((char*)inet_ntoa(*(struct in_addr*)(hp->h_addr)));
    int result;
    result = connect(ClientSock, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));

    if (0 != result)
    {
        printf("Error: %d\n", WSAGetLastError());
        WSACleanup();
    }

  return ClientSock; 

int main()
{
   char sendbuf[]="GET / HTTP/1.1\r\nHost:localhost\r\nConnection:closeUser-agent:MyApp/0.1Accept-language:zh-cn\r\n\r\n";
   char recvBuf [6000];
   //// 端口应该是80 ps:www.baidu.com 没有返回信息,用了baidu.com
   int ClientSock = open_clientfd("baidu.com", 80);

   int result = send (ClientSock , sendbuf , strlen(sendbuf) , 0);
   memset(recvBuf,0x00,sizeof(recvBuf));

   int recvresult = recv(ClientSock, recvBuf, 6000, 0);
   
  printf("%s",recvBuf);

  closesocket(ClientSock);
  WSACleanup();
  return 0;
}

上面的代码是在lz的代码基础上做了修改,修改的地方用了(////)注释方式,做了说明
http的默认端口是80,而百度的65000端口没有开放,lz可以使用浏览器连接www.baidu.com:65000尝试,看看结果

#6


该回复于2010-10-22 09:38:34被版主删除

#7


改下端口跟ip地址拷贝方式.

#8


端口没对上...

#9


netstat 查看端口状态
tcpdump抓包分析

#10


很强悍啊顶起

#11


楼上说的果然有道理,ping www.baidu.com 10065不通啊,不过也有可能是楼主一定要这么干,我很好奇楼主想通过这个代码干嘛?
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <process.h>
#include "malloc.h"
#include "winsock2.h"
#include <stdlib.h>
#include <conio.h>

int open_clientfd(const char* hostname, int port)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
    {
        printf("Error: %d\n", WSAGetLastError());
        return -1;
    }

if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
    {
        printf("Error: %d\n", WSAGetLastError());
        WSACleanup( );
        return -1;
    }

int ClientSock;
struct hostent* hp;
struct sockaddr_in serveraddr;
if ((ClientSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        return -1; /* check errno for cause of error */
    }

/* Fill in the server's IP address and port */
if ((hp = gethostbyname(hostname)) == NULL)
    {
        return -2; /* check h_errno for cause of error */
    }

memcpy(&serveraddr.sin_addr,hp->h_addr_list,hp->h_length);

//   serveraddr.sin_addr.S_un.S_addr=inet_addr(((const char*)hp->h_addr[0]));
//serveraddr.sin_addr.S_un.S_addr =((LPIN_ADDR)hp->h_addr)->S_un.S_addr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port); //感觉这几句有问题。。。
int result;
result = connect(ClientSock, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));

if (0 != result)
    {
        printf("Error: %d\n", WSAGetLastError());
        WSACleanup();
    }

return ClientSock;
}

int main()
{
char sendbuf[]="GET / HTTP/1.1\r\nHost:localhost\r\nConnection:closeUser-agent:MyApp/0.1Accept-language:zh-cn\r\n\r\n";
char recvBuf [6000];
int ClientSock = open_clientfd("www.baidu.com", 65000);

int result = send (ClientSock , sendbuf , strlen(sendbuf) , 0);
memset(recvBuf,0x00,sizeof(recvBuf));

int recvresult = recv(ClientSock, recvBuf, 6000, 0);

printf("%s",recvBuf);

closesocket(ClientSock);
WSACleanup();
return 0;
}

#12


说错了,是65000

#13


引用 11 楼 bobo364 的回复:
楼上说的果然有道理,ping www.baidu.com 10065不通啊,不过也有可能是楼主一定要这么干,我很好奇楼主想通过这个代码干嘛?

C/C++ code
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <process.h>
#include "malloc.h"
#include "……


这只是个测试,我想写一个爬虫的程序,可是之前就一直connect不上,所以就写一个小程序 test一下了。。

#14


想问一下,爬虫程序的 发送的内容是

char sendbuf[]="GET / HTTP/1.1\r\nHost:localhost\r\nConnection:closeUser-agent:MyApp/0.1Accept-language:zh-cn\r\n\r\n";

是这个字符串吗?

#15


解析得到ip地址的时候出错了,得到的IP地址不正确,5楼的代码可以连上,其中有修改说明

#16


tiao618说得对
服务器地址赋值改为
memcpy(&serveraddr.sin_addr,hp->h_addr,sizeof(in_addr));
端口改为80

#1


connect 错误码 10060

#2


顶顶 别人来解决

#3


看到这个问题很感兴趣,所以研究了一会儿,首先说下我觉得出现的问题:
1 gethostbyname返回来的是不是正确的信息,lz怀疑这点应该是正确的,我觉得都没有连上百度怎么获取他的IP等信息?
2 端口号不对,根据我的经验,C端和S端port必须相同,才能连接的上,百度的端口号是65000吗?

基于以上考虑,修改
memcpy(&serveraddr.sin_addr,hp->h_addr_list,hp->h_length);
把这行替换成:
serveraddr.sin_addr.S_un.S_addr = inet_addr("220.181.6.18"); //百度的ip,ping后知道的
然后再运行了下,还是10060错误

接下来改端口,但是在网上没有查到百度的端口号,就随便猜了一个80
结果就没有出现错误了,这么说是不是就练到百度上去了?

最后recvresult值为1238960

#4


刚才和我的同事讨论了下,分享一下获取网站IP和port的方法
1 打开cmd
2 ping www.baidu.com //就是你想访问的网页,百度的为220.181.6.18
3 然后打开一个百度网页  
4 在cmd里面输入natstat -an,就可以所有ip对应的端口号了,你找到220.181.6.18,发现后面跟的是80

所以事实上百度的端口就是80

#5



#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <process.h>
#include "malloc.h"
#include "winsock2.h"
#include <stdlib.h>
#include <conio.h>
#pragma comment(lib,"Ws2_32.lib")

int open_clientfd(const char* hostname, int port) 

    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD( 1, 1 );    
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) 
    {
        printf("Error: %d\n", WSAGetLastError());
        return -1;
    }                                      
    
    if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) 
    {   
        printf("Error: %d\n", WSAGetLastError());
        WSACleanup( );
        return -1; 
    }

  int ClientSock; 
  struct hostent* hp; 
  struct sockaddr_in serveraddr;  
  if ((ClientSock = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    return -1; /* check errno for cause of error */ 
  
   /* Fill in the server's IP address and port */ 
  if ((hp = gethostbyname(hostname)) == NULL) 
    return -2; /* check h_errno for cause of error */

  //// 这里转换的ip地址是错误的
  ////memcpy(&serveraddr.sin_addr,hp->h_addr_list,hp->h_length);
  ////

  serveraddr.sin_family = AF_INET; 
  serveraddr.sin_port = htons(port); //感觉这几句有问题。。。
  //// 设置ip地址
  serveraddr.sin_addr.S_un.S_addr=inet_addr((char*)inet_ntoa(*(struct in_addr*)(hp->h_addr)));
    int result;
    result = connect(ClientSock, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));

    if (0 != result)
    {
        printf("Error: %d\n", WSAGetLastError());
        WSACleanup();
    }

  return ClientSock; 

int main()
{
   char sendbuf[]="GET / HTTP/1.1\r\nHost:localhost\r\nConnection:closeUser-agent:MyApp/0.1Accept-language:zh-cn\r\n\r\n";
   char recvBuf [6000];
   //// 端口应该是80 ps:www.baidu.com 没有返回信息,用了baidu.com
   int ClientSock = open_clientfd("baidu.com", 80);

   int result = send (ClientSock , sendbuf , strlen(sendbuf) , 0);
   memset(recvBuf,0x00,sizeof(recvBuf));

   int recvresult = recv(ClientSock, recvBuf, 6000, 0);
   
  printf("%s",recvBuf);

  closesocket(ClientSock);
  WSACleanup();
  return 0;
}

上面的代码是在lz的代码基础上做了修改,修改的地方用了(////)注释方式,做了说明
http的默认端口是80,而百度的65000端口没有开放,lz可以使用浏览器连接www.baidu.com:65000尝试,看看结果

#6


该回复于2010-10-22 09:38:34被版主删除

#7


改下端口跟ip地址拷贝方式.

#8


端口没对上...

#9


netstat 查看端口状态
tcpdump抓包分析

#10


很强悍啊顶起

#11


楼上说的果然有道理,ping www.baidu.com 10065不通啊,不过也有可能是楼主一定要这么干,我很好奇楼主想通过这个代码干嘛?
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <process.h>
#include "malloc.h"
#include "winsock2.h"
#include <stdlib.h>
#include <conio.h>

int open_clientfd(const char* hostname, int port)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
    {
        printf("Error: %d\n", WSAGetLastError());
        return -1;
    }

if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
    {
        printf("Error: %d\n", WSAGetLastError());
        WSACleanup( );
        return -1;
    }

int ClientSock;
struct hostent* hp;
struct sockaddr_in serveraddr;
if ((ClientSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        return -1; /* check errno for cause of error */
    }

/* Fill in the server's IP address and port */
if ((hp = gethostbyname(hostname)) == NULL)
    {
        return -2; /* check h_errno for cause of error */
    }

memcpy(&serveraddr.sin_addr,hp->h_addr_list,hp->h_length);

//   serveraddr.sin_addr.S_un.S_addr=inet_addr(((const char*)hp->h_addr[0]));
//serveraddr.sin_addr.S_un.S_addr =((LPIN_ADDR)hp->h_addr)->S_un.S_addr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(port); //感觉这几句有问题。。。
int result;
result = connect(ClientSock, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));

if (0 != result)
    {
        printf("Error: %d\n", WSAGetLastError());
        WSACleanup();
    }

return ClientSock;
}

int main()
{
char sendbuf[]="GET / HTTP/1.1\r\nHost:localhost\r\nConnection:closeUser-agent:MyApp/0.1Accept-language:zh-cn\r\n\r\n";
char recvBuf [6000];
int ClientSock = open_clientfd("www.baidu.com", 65000);

int result = send (ClientSock , sendbuf , strlen(sendbuf) , 0);
memset(recvBuf,0x00,sizeof(recvBuf));

int recvresult = recv(ClientSock, recvBuf, 6000, 0);

printf("%s",recvBuf);

closesocket(ClientSock);
WSACleanup();
return 0;
}

#12


说错了,是65000

#13


引用 11 楼 bobo364 的回复:
楼上说的果然有道理,ping www.baidu.com 10065不通啊,不过也有可能是楼主一定要这么干,我很好奇楼主想通过这个代码干嘛?

C/C++ code
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <process.h>
#include "malloc.h"
#include "……


这只是个测试,我想写一个爬虫的程序,可是之前就一直connect不上,所以就写一个小程序 test一下了。。

#14


想问一下,爬虫程序的 发送的内容是

char sendbuf[]="GET / HTTP/1.1\r\nHost:localhost\r\nConnection:closeUser-agent:MyApp/0.1Accept-language:zh-cn\r\n\r\n";

是这个字符串吗?

#15


解析得到ip地址的时候出错了,得到的IP地址不正确,5楼的代码可以连上,其中有修改说明

#16


tiao618说得对
服务器地址赋值改为
memcpy(&serveraddr.sin_addr,hp->h_addr,sizeof(in_addr));
端口改为80