本人新手,想通过socket开发访问网页,并得到那个网页反馈的信息,调研之后发现可以使用send和recv。
请问socket中的send和recv怎么用?

解决方案 »

  1.   

    MSDN中就有例子,给你贴上。
    #include <stdio.h>
    #include "winsock2.h"void main() {
      //----------------------
      // Initialize Winsock
      WSADATA wsaData;
      int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
      if (iResult != NO_ERROR)
        printf("Error at WSAStartup()\n");  //----------------------
      // Create a SOCKET for connecting to server
      SOCKET ConnectSocket;
      ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return;
      }  //----------------------
      // The sockaddr_in structure specifies the address family,
      // IP address, and port of the server to be connected to.
      sockaddr_in clientService; 
      clientService.sin_family = AF_INET;
      clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
      clientService.sin_port = htons( 27015 );  //----------------------
      // Connect to server.
      if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
        printf( "Failed to connect.\n" );
        WSACleanup();
        return;
      }  //----------------------
      // Declare and initialize variables.
      int bytesSent;
      int bytesRecv = SOCKET_ERROR;
      char sendbuf[32] = "Client: Sending data.";
      char recvbuf[32] = "";  //----------------------
      // Send and receive data.
      bytesSent = send( ConnectSocket, sendbuf, strlen(sendbuf), 0 );
      printf( "Bytes Sent: %ld\n", bytesSent );  while( bytesRecv == SOCKET_ERROR ) {
        bytesRecv = recv( ConnectSocket, recvbuf, 32, 0 );
        if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
          printf( "Connection Closed.\n");
          break;
        }
        printf( "Bytes Recv: %ld\n", bytesRecv );
      }  WSACleanup();
      return;
    }
      

  2.   

    多看看别人是怎么用的吧
    也就是一个流程的问题
    如果是服务器就要建立、绑定、侦听、连接
    然后通过send 和 recv 来发送和接收消息。
    不知你是用什么来实现,如果是MFC 则recv函数的意思是只要系统缓冲区中有数据存在,程序就会自动的调用recv函数来进行接收处理。
      

  3.   

    我是用MFC开发,通过访问一个网址,然后得到这个网址反馈回来的信息。然后再解析这些信息,从而使用。
      

  4.   

    我这里是客户端。我刚才试验了一下,已知www.google.com.cn的IP地址是:203.208.37.99当我这么写代码:clientService.sin_addr.s_addr = inet_addr( "203.208.37.99" );可以通过那个connect函数的判断链接。但当我这么些代码: clientService.sin_addr.s_addr = inet_addr( "http://www.google.com.cn" );则通不过那个connect函数的判断链接。请问这是怎么回事?
      

  5.   

    使用WinInet类,用GetHttpConnection与服务器进行连接
      

  6.   

    "http://www.google.com.cn"不是地址,用gethostbyname("www.google.com.cn")可以得到地址。
      

  7.   

    先谢。用gethostbyname("www.google.com.cn")可以得到地址。但是得到网址之后,怎么拿来放在clientService.sin_addr.s_addr = inet_addr( "203.208.37.99" );中使用?发现inet_addr使用类型是const char *而gethostbyname("www.google.com.cn")得到的地址是hostent *类型。
      

  8.   

    hostent结构中的h_addr_list是一个地址列表,一般情况取h_addr_list[0]来用就行了。自己编程调试一下,看看结构中的数据就明白了。