Я новичок в c++ и программировании сокетов. Мне удалось создать сервер с помощью c++ на машине unix, и я подключил этот сервер к java-клиенту, работающему на другой машине Windows. Мне также удалось отправить сообщения от клиента на сервер с успехом. То, что я havent удалось еще, это отправить сообщения от сервера к клиенту. Я полагаю, что я новичок в c++, но я не нашел в интернете что-то очень полезное. Я только нашел c++ клиентский код связи с сервером, а не сервер для клиента. Может кто-нибудь дать какое-то руководство?
Thnx заранее для вашего времени и вашей помощи...
c++ код сервера
int main( int argc, const char** argv )
{
/* SOCKET VARIABLES */
int sock;
struct sockaddr_in server;
int mysock;
char buff[1024];
int rval;
/*CREATE SOCKET*/
sock =socket(AF_INET, SOCK_STREAM, 0);
if (sock<0)
{
perror("*FAILED TO CREATE SOCKET*");
exit(1);
}
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=htons(5000);
/*CALL BIND*/
if (bind(sock, (struct sockaddr *)&server, sizeof(server)))
{
perror("BIND FAILED");
exit(1);
}
/*LISTEN*/
listen(sock, 5);
/*ACCEPT*/
do{
mysock= accept(sock, (struct sockaddr *) 0, 0);
if (mysock==-1)
{
perror ("ACCEPT FAILED");
}
else
{
memset(buff, 0, sizeof(buff));
if ((rval=recv(mysock, buff, sizeof(buff), 0)) < 0)
perror("READING STREAM MESSAGE ERROR");
else if(rval==0)
printf("Ending connection");
else
printf("MSG: %s\n", buff);
printf("GOT THE MESSAGE (rval = %d)\n", rval);
}
}while (1) ;
return 0;
Код клиента Java
public class SOK_1_CLIENT {
public void run() throws Exception
{
String adrress="172.16.151.237"; //localhost -- samemachine
Socket SOCK =new Socket (adrress,5000);
PrintStream PS =new PrintStream(SOCK.getOutputStream());
PS.println("HELLO TO SERVER FROM CLIENT");
InputStreamReader IR =new InputStreamReader(SOCK.getInputStream());
BufferedReader BR = new BufferedReader(IR);
String MESSAGE =BR.readLine();
System.out.println(MESSAGE + "java");
}
}
В C сокетах есть дескрипторы файла двусторонней коммуникации. Вы можете написать им, используя send(2)
. Проверьте man 2 send
.
char * buffer;
size_t length, sent;
while (length && (sent = send(mysock, buffer, length, 0)) > 0) {
length -= send;
}
if (sent < 0)
perror("send");
Обратите внимание, что в отличие от java BufferedWriter
в C send
не гарантирует отправку всего буфера за один раз. Таким образом, цикл while. Если вы хотите буферизованный сокет IO, вы можете использовать fdopen
для создания потока stdio
, но это не рекомендуется, если вы хотите иметь возможность передавать флаги и перехватывать ошибки сокетов.
Хорошо, я вижу, что вам удалось получить messsage на C++ сервере и отправить из java-клиента. См. "Получение из сокета" в java и "отправка из сокета" в C++. Используйте их в приведенном выше коде и помните, когда сервер отправляет, в то время, когда java-клиент должен ожидать данных с сервера. Это решит вашу проблему.
Если вы хотите сделать клиент-сервер как чат-приложение, у вас есть две возможности:
google ключевые слова, выделенные в соответствии с вашими требованиями и используемым языком.