1

C++ で単純なクライアント サーバー チャット プログラムを作成しようとしています。私はこれを書きましたが、私の問題は、サーバーからクライアントにデータを送信できることです。全二重通信を行い、クライアントからサーバーにもデータを送信したい。

これが私のコードです。

サーバー:

#include "stdafx.h"
#include <WinSock2.h>
#include <winsock.h>
#include <stdio.h>
#include <iostream>
#include <string>
#define RCVBUFSIZE 32
using namespace std;

#pragma comment(lib, "Ws2_32.lib")



int main()
{
    WSADATA wsadat;
    SOCKET welcome_socket = INVALID_SOCKET;
    string IpAddress;
    int PortNom;
    SOCKADDR_IN SockAddress;

    //-----------------------------------------------
if (WSAStartup(MAKEWORD(2,2),&wsadat) !=NO_ERROR)
{
    cout << "WSA intialization failed. \n";
    WSACleanup();
    return 1;
}
//------------------------------------------------
welcome_socket = socket(AF_INET , SOCK_STREAM , 0);

//--------------------------------------------------
cout << "Enter your ip address: ";
cin >> IpAddress;

cout << "Enter your port nomber:";
cin >> PortNom;

//---------------------------------------------------

SockAddress.sin_addr.s_addr = inet_addr (IpAddress.c_str());
SockAddress.sin_port = htons(PortNom);
SockAddress.sin_family = AF_INET;

//---------------------------------------------------

bind(welcome_socket,(SOCKADDR *)&SockAddress,sizeof(SockAddress));
listen(welcome_socket,1);

//----------------------------------------------------

SOCKET Comm_sock;
SOCKADDR_IN ClientAddr;
int AddressLen = sizeof (ClientAddr);
char *buffer = new char[13];

int turn= 0;
char* buf = new char[50];
char temp;
while (true)
{
    Comm_sock = accept(welcome_socket,(SOCKADDR *)&ClientAddr , &AddressLen);
    while (buf != "exit")
    {
        if (turn == 0)
        {
            cout << endl;
            recv(Comm_sock,buf,50,0);

            if(buf[0]=='e' && buf[1]=='x' && buf[2]=='i' && buf[3]=='t')
                return 0;

            cout << "MsG from client :"<< buf << endl;
            cin.get(temp);
            turn = 1;
        }
        if  (turn == 1)
        {
            cout << "Enter MsG:";
            cin.get(buf,50);
            if (buf[0]=='e' && buf[1]=='x' && buf[2]=='i' && buf[3]=='t')
                return 0;
                send(Comm_sock,buf,strlen(buf)+1,0);
                cin.get(temp);
            turn=0; 
        }
    }
}

とクライアント:

#include "stdafx.h"
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
#include <iostream>


using namespace std;
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "12345"

//-------------------------------------
int main ()
{
    WSADATA wsadata;
    int iResult;

    SOCKET ConnectSocket = INVALID_SOCKET;
    struct sockaddr_in clientservice;

    char *sendbuf ="";
    char recvbuf[DEFAULT_BUFLEN];
    char sendbuffer[512];
    int recvbuflen = DEFAULT_BUFLEN;
    int sendbuflen = 512;

//----------------------------------

iResult = WSAStartup(MAKEWORD(2,2),&wsadata);

//----------------------------------

ConnectSocket = socket(AF_INET,SOCK_STREAM , IPPROTO_TCP);

//-----------------------------------

clientservice.sin_family = AF_INET;
clientservice.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    clientservice.sin_port = htons( 11111 );

 //-----------------------------------

iResult = connect (ConnectSocket,(SOCKADDR *)&clientservice      ,sizeof(clientservice));
iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
cout << "bytes Sent:" << iResult << "\n";

//-------------------------------------

iResult = shutdown(ConnectSocket ,SD_SEND);
    if (iResult == SOCKET_ERROR) 
{
    printf("shutdown failed: %d\n", WSAGetLastError());
    closesocket(ConnectSocket);
    WSACleanup();
    return 1;
}


    do {
        string reciev;
        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
         recvbuf[iResult]= 0 ;
         cout << recvbuf << endl;



    } while(true);

 //------------------------------------------
    closesocket(ConnectSocket);
    WSACleanup();
}
4

0 に答える 0