winsock2 — Как создать полнодуплексную программу чата win ++ck c ++

Я пытаюсь сделать простую клиент-серверную программу чата на 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();
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]