Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > простой tcp/ip client


Автор: Robin 16.5.2007, 18:32
по мсдну написал следуйщее:
сервер:
Код

#include <stdio.h>
#include "winsock2.h"

int main() {

  WSADATA wsaData;
  SOCKET RecvSocket;
  struct sockaddr_in peer;
  int Port = 27015;
 char RecvBuf[1024];
  int  BufLen = 1024;
  struct sockaddr_in SenderAddr;
  int SenderAddrSize = sizeof(SenderAddr);

  WSAStartup(MAKEWORD(2,2), &wsaData);

  RecvSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  peer.sin_family = AF_INET;
  peer.sin_addr.s_addr = inet_addr("127.0.0.1");
  peer.sin_port = htons(27015);(INADDR_ANY);

  bind(RecvSocket, (SOCKADDR *) &peer, sizeof(peer));


  if (listen(  RecvSocket, 1 ) == SOCKET_ERROR) {
    printf("Error listening on socket.\n");
    closesocket( RecvSocket);
    WSACleanup();
    return 1;
  }


  SOCKET AcceptSocket;
  printf("Waiting for client to connect...\n");



  AcceptSocket = accept(RecvSocket, NULL, NULL );
  if (AcceptSocket == INVALID_SOCKET) {
    printf("accept failed: %d\n", WSAGetLastError());
    closesocket(RecvSocket);
    WSACleanup();
    return 1;
  } else
    printf("Client connected.\n");

 printf("Receiving datagrams...\n");
  recv(RecvSocket,
    RecvBuf,
    BufLen,
    0);
for(int i = 0; i<strlen(RecvBuf); i++)
    {
printf("%c",  RecvBuf[i]);
}


  printf("Finished receiving. Closing socket.\n");
  closesocket(RecvSocket);


  printf("Exiting.\n");
  WSACleanup();
  return 0;
}


клиент:


Код

#include <winsock2.h>
#include <stdio.h>

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"

int __cdecl main() {

    //----------------------
    // Declare and initialize variables.


    int iResult;
  WSADATA wsaData;
    SOCKET ConnectSocket;
    struct sockaddr_in clientService;

    char *sendbuf = "this is a test";
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;

    //----------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != NO_ERROR) {
      printf("WSAStartup failed: %d\n", iResult);
      return 1;
    }

    //----------------------
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 1;
    }

    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    clientService.sin_port = htons( 27015 );

    //----------------------
    // Connect to server.
    iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
    if ( iResult == SOCKET_ERROR) {
        closesocket (ConnectSocket);
        printf("Unable to connect to server: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    // Send an initial buffer
    iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    if (iResult == SOCKET_ERROR) {
        printf("send failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
}

    printf("Bytes Sent: %ld\n", iResult);

    // shutdown the connection since no more data will be sent
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    // Receive until the peer closes the connection
    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            printf("Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());

    } while( iResult > 0 );

    // cleanup
    closesocket(ConnectSocket);
    WSACleanup();

    return 0;
}


когда вывожу строку, появляется абракадабра.
что делать?

Автор: Sartorius 16.5.2007, 18:50
 Строчку покажи. Где и какую строку ты выводишь.  smile 

Автор: Robin 16.5.2007, 19:01
Sartorius 
 
Цитата

printf("Receiving datagrams...\n");
  recv(RecvSocket,
    RecvBuf,
    BufLen,
    0);
for(int i = 0; i<strlen(RecvBuf); i++)
    {
printf("%c",  RecvBuf[i]);

Цитата


    char *sendbuf = "test";

Цитата


iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );

Автор: ptr 17.5.2007, 07:58
recv не добавляет в строку завершающий '\0', поэтому это надо делать самому:
Код

int len = recv(RecvSocket, RecvBuf, BufLen, 0);
RecvBuf[len]='\0';

Автор: Robin 17.5.2007, 18:00
всеравно

Код

int len = recv(RecvSocket, RecvBuf, BufLen, 0);
RecvBuf[len]='\0';
printf(RecvBuf);


Код


C:\Documents and Settings\Стас>C:\lcc\lcc\servvvv.exe
Waiting for client to connect...
Client connected.
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· 
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ☻Exiting.

Автор: ptr 18.5.2007, 11:59
Неправильный сокет в recv, надо:
Код

recv(AcceptSocket, RecvBuf, BufLen, 0);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)