не могу создать соединение между сервером и клиентом по tcp/ip на Linux Mint. Компилирую через gcc.Connect возвращает -1 и errno выдает ECONNREFUSED. До этого сервера писал только на винде используя winsock2. Сервер
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/signal.h>
#include <sys/wait.h>
#include <sys/resource.h>
#include <netinet/in.h>
#include <iostream>
#include <unistd.h>
#include <iomanip>
#include <string.h>
using namespace std;
int main()
{
int s,s2,bl;
s=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in local;
local.sin_port=htonl(7500);
local.sin_family=AF_INET;
local.sin_addr.s_addr=htonl(INADDR_ANY);
bl=bind(s,(struct sockaddr*)&local,sizeof(local));
cout<<"Listen\n";
bl=listen(s,5);
cout<<"Accept\n";
s2=accept(s,0,0);
send(s2,"HW",sizeof("HW"),0);
}
Клиент
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <iostream>
#include <unistd.h>
#include <iomanip>
#include <string.h>
using namespace std;
int main()
{
int s,rc;
s=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in peer;
peer.sin_family=AF_INET;
peer.sin_port=htons(7500);
peer.sin_addr.s_addr=inet_addr("127.0.0.1");
cout<<"Connecting\n";
rc=connect(s,(struct sockaddr*)&peer,sizeof(peer));
switch (errno)
{
case EACCES:
fprintf(stdout, "EACCESS");
break;
case EPERM:
fprintf(stdout, "EPERM");
break;
case EADDRINUSE:
fprintf(stdout, "EADDRINUSE");
break;
case EAFNOSUPPORT:
fprintf(stdout, "EAFNOSUPPORT");
break;
case EAGAIN:
fprintf(stdout, "EAGAIN");
break;
case EALREADY:
fprintf(stdout, "EALREADY");
break;
case EBADF:
fprintf(stdout, "EBADF");
break;
case ECONNREFUSED:
fprintf(stdout, "ECONNREFUSED");
break;
case EFAULT:
fprintf(stdout, "EFAULT");
break;
case EINPROGRESS:
fprintf(stdout, "EINPROGRESS");
break;
case EINTR:
fprintf(stdout, "EINTR");
break;
case EISCONN:
fprintf(stdout, "EISCONN");
break;
case ENETUNREACH:
fprintf(stdout, "ENETUNREACH");
break;
case ENOTSOCK:
fprintf(stdout, "ENOTSOCK");
break;
case ETIMEDOUT:
fprintf(stdout, "ETIMEDOUT");
break;
default:
fprintf(stdout, "unknown error(%d)", errno);
break;
}
cout<<endl;
char choice[100];
char buf[100];
recv(s,buf,sizeof("HW"),0);
}
local.sin_port=htonl(7500);
Должно быть htons, а не htonl — в итоге сервер не тот порт слушает.
На будущее: советую освоить использование утилиты netstat.
netstat -t4lp сразу бы показало, что не так.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей