Сервер должен bind
к тому же порту, к которому клиент connect
с. Таким образом, сервер и клиент будут общаться друг с другом. Как правило, сервер bind
с общеизвестным портом и listen
с. Клиент не вызывает bind
, что приводит к его привязке к случайному порту. Но он вызывает connect
для подключения к известному порту сервера. Сервер прослушивает, отправляет и получает через известный порт. Клиент подключается к известному порту, отправляет его и получает от него.
Кроме того, на самом деле никогда не делайте этого:
recv(sockid,buff,1024,0);
cout<<"Received msg: "<<buff;
TCP не является протоколом на основе сообщений. Функция recv
при вызове через сокет TCP не получает сообщение и даже не знает, что такое сообщение. Когда вы вызываете поток operator<<
и передаете его char *
, как и вы, он ожидает, что char *
будет указывать на правильную строку в стиле C, что не гарантируется в этом коде. Хуже того, вы проигнорировали возвращаемое значение из recv
, которое является только способом узнать, сколько байтов вы получили.
Здесь есть похожая проблема:
if(send(client_socket,buff,strlen(buff),0)<0){
Вы не отправляете завершающий нулевой байт, поэтому у получателя нет возможности выяснить, где заканчивается сообщение, кроме как по факту, что вы затем закроете соединение. Это работает только в том случае, если вы хотите отправить только одно сообщение, а затем закрыть соединение без какой-либо возможности ответа. И в этом случае получатель должен продолжать звонить recv
, пока не получит указание о том, что соединение было закрыто, прежде чем он считает, что получил сообщение.