У меня возникли проблемы с простым TCP-сокетом с функцией connect() и read(). Эта программа работает, если я запускаю сервер сначала, а клиент второй. Однако, когда я сначала запускаю клиент, он продолжает пытаться подключиться к серверу, а затем, когда я запускаю сервер, он соединяется, но последующее чтение возвращает 0 байтов. Это говорит о том, что сервер закрыл сокет, но операторы отладки не поддерживают это.Ошибка TCP-соединения
Я пытаюсь, чтобы клиент постоянно пытался подключиться к серверу на порту 6380, а затем читать данные. Если соединение потеряно, клиент попытается снова подключиться. У меня SO_REUSEADDR установлен для сокетов. Есть ли что-то еще, что мне не хватает?
Исходный код для сервера
//***** SERVER *****
#include <iostream>
#include "SocketAdapter.h"
#include "SocketServer.h"
#include <errno.h>
#include <string.h>
unsigned char buffer[] = "123123123";
int main()
{
SocketAdapter socket;
SocketServer server(6380);
server.Start();
std::cout << "Wait for Connection" << std::endl;
server.WaitForConnection(socket);
std::cout << "Start to Send Data" << std::endl;
while(1)
{
std::cout << "Sending Data ";
int bytesSent = socket.Send(buffer, 10);
std::cout << "byteSent = " << bytesSent << std::endl;
if (bytesSent == -1)
{
std::cout << "Errno (" << errno << ") - " << strerror(errno) << std::endl;
}
sleep(1);
}//end while
std::cout << "Ending Server" << std::endl;
socket.Close();
return 0;
}
Исходный код для клиента
// ***** SIMPLE CLIENT ******
#include <iostream>
#include "SocketAdapter.h"
#include "SocketClient.h"
#include <string.h>
#include <errno.h>
int main()
{
SocketAdapter socket;
SocketClient client(6380, "127.0.0.1");
unsigned char buffer[1024];
while(1)
{
client.Start();
//Loop till we connect to Server
while(!client.Connect(socket))
{
std::cout << "Trying to connect to server." << std::endl;
sleep(1);
}
std::cout << "Connected to Server" << std::endl;
//Read till we get a timeout
while(1)
{
int bytesRead = socket.Recv(buffer, 10,2000);
if (bytesRead != 10)
{
std::cout << " Failed to Read" << std::endl;
std::cout << " bytesRead = " << bytesRead << std::endl;
std::cout << " Errno (" << errno << ") - "
<< strerror(errno) << std::endl;
break;
}
std::cout << "buffer = " << buffer << std::endl;
usleep(250000);
}
std::cout << "Something went wrong, restart" << std::endl;
}
return 0;
}
ВЫВОД Серверной
./Server
Wait for Connection
Start to Send Data
Sending Data byteSent = 10
ВЫВОД КЛИЕНТА
./Client
Trying to connect to server.
Trying to connect to server.
Connected to Server
Failed to Read
bytesRead = 0
Errno (107) - Transport endpoint is not connected
Something went wrong, restart
Close Socket
Close Socket File Descriptor
Connected to Server
Trying to Recv on a closed socket
Return Value = -1
Errno = Connection reset by peer
Failed to Read
bytesRead = -3
Errno (104) - Connection reset by peer
Something went wrong, restart
Close Socket
Close Socket File Descriptor
Socket cannot shutdown!
Return Value = -1
Errno = Transport endpoint is not connected
Trying to connect to server.
Close Socket
Close Socket File Descriptor
Socket cannot shutdown!
Return Value = -1
Errno = Transport endpoint is not connected
Что такое SocketAdapter.h и SocketServer.h? Доморощенные? – dgnorton
Я удивлен, что вывод сервера не извергает «Отправка данных byteSent = 10» снова и снова. Почему буфер 123 МБ на сервере? Клиент предполагает, что всегда будет читать 10 байт ... вероятно, будет даже без гарантии даже при нормальной работе. – dgnorton
, вы можете рассмотреть [Boost.Asio] (http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/overview/rationale.html) вместо своих родных оболочек. –