尝试连接时出现C ++套接字超时错误

时间:2019-03-16 09:52:18

标签: c++ c sockets networking

我最近开始使用c / c ++套接字编程,所以我做了一个简单的程序,服务器和客户端相互响应。我的服务器在VMware(Linux fedora)中,客户端在Windows(Visual Studio 2017中)。

它奏效了(请注意,服务器和客户端位于一台笔记本电脑中。)

我还在另一台计算机(我的台式机)上尝试了相同的客户端代码,并得到了WSAETIMEDOUT(10060) 错误。该错误是在客户端代码的connect()函数中捕获的。

我不知道如何解决:(

有人可以帮助我吗?

这是客户代码

#include <iostream>

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>

using namespace std;

#define DEFAULT_BUFLEN  512

int main(int argc, char *argv[]) {

   WSADATA wsaData;
   SOCKET connectSocket;
   SOCKADDR_IN servAddr;

   char sendBuf[DEFAULT_BUFLEN];
   char recvBuf[DEFAULT_BUFLEN];

   char nickName[DEFAULT_BUFLEN];

   int recvLen = 0;


   if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
       cout << "start up error";
       exit(1);
   }

   connectSocket = socket(PF_INET, SOCK_STREAM, 0);

   if (connectSocket == INVALID_SOCKET) {
       cout << "socket creation error";
       exit(1);
   }

   memset(&servAddr, 0, sizeof(servAddr));
   servAddr.sin_family = AF_INET;
   servAddr.sin_addr.s_addr = inet_addr(argv[1]);
   servAddr.sin_port = htons(atoi(argv[2]));

   if (connect(connectSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) {
       cout << "connect error: " << WSAGetLastError();
       exit(1);
   }

   while (1) {

     recvLen = recv(connectSocket, recvBuf, sizeof(recvBuf), 0);
     if (recvLen > 0) {

        if (strcmp(recvBuf, "Exit") == 0)
            break;

        cout << recvBuf;
        //cin >> nickName;
        cin.getline(nickName, DEFAULT_BUFLEN);

        send(connectSocket, nickName, sizeof(nickName),0);
    }
    else if (recvLen == 0)
        cout << "Connection closed";
    else if (recvLen == -1)
        cout << "Connection failed";
}

closesocket(connectSocket);
WSACleanup();

return 0;

}

  

Blockquote

和服务器代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <iostream>
#include <string>

#define DEFAULT_LEN 512
#define DEFAULT_CLIENT_NUM  30

using namespace std;

char nickNameCommand[]="Please set your nickName:";

void error_handling(char * message);

class Client {

private:
  char nickName[DEFAULT_LEN];
  int clientSock;


public:

   struct sockaddr_in clnt_addr;

   int& getClientSock(){
    return clientSock;
   }


};


class Server {


private:

   int serv_sock;

   char informClientNickName[DEFAULT_LEN] = "Your NickName is ";

public:

   Server(){

 }

 char message[DEFAULT_LEN]= "";
 char clientNickName[DEFAULT_CLIENT_NUM][DEFAULT_LEN];  
 struct sockaddr_in serv_addr;

 void setServSock(int value){
    serv_sock = value;
 }

 int getServSock(){
    return serv_sock;
}

 void setInformClientNickName(int clientNum){
    strcat(informClientNickName,clientNickName[clientNum]);
    strcat(message , informClientNickName);
}

char* getInformClientNickName(){
    return informClientNickName;
}

};


int main(int argc,char * argv[]) 
{

Client clientSocket[DEFAULT_CLIENT_NUM];
Server server;

int clientNum=0;
int recvLen=0;

socklen_t clnt_addr_size;

char message[DEFAULT_LEN];

if(argc!=2)
{
 printf("Usage: %s <port>\n",argv[0]);
 exit(1);
}

server.setServSock(socket(PF_INET,SOCK_STREAM,0));
if(server.getServSock() == -1)
error_handling("socket() error");

memset(&(server.serv_addr),0,sizeof(server.serv_addr));
server.serv_addr.sin_family=AF_INET;
server.serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server.serv_addr.sin_port=htons(atoi(argv[1]));

if(bind(server.getServSock(),(struct sockaddr*)& 
(server.serv_addr),sizeof(server.serv_addr)) ==-1)
    error_handling("bind() error");

if(listen(server.getServSock(),5)==-1)
    error_handling("listen() error");

clnt_addr_size=sizeof(clientSocket[0].clnt_addr);

while(1) {

clientSocket[clientNum].getClientSock() = accept(server.getServSock(), 
(struct sockaddr*)&(clientSocket[clientNum].clnt_addr),&clnt_addr_size);

if(clientSocket[clientNum].getClientSock()==-1)
    error_handling("accept() error");
else{
    write(clientSocket[clientNum].getClientSock(),nickNameCommand,sizeof(nickNameCommand));

    read(clientSocket[clientNum].getClientSock(),(void*)(server.clientNickName[clientNum]),DEFAULT_LEN);
}

    cout << "Received name is : " << server.clientNickName[clientNum]<<endl;


    clientNum++;
    cout << "ClientNum: " << clientNum <<endl;
    recvLen=0;


    for(int i=0;i<clientNum;i++){

    server.setInformClientNickName(i);
    write(clientSocket[clientNum].getClientSock(),server.message,sizeof(server.message));


 }

}

for(int i=0;i<clientNum;i++)
    close(clientSocket[i].getClientSock());

close(server.getServSock());


return 0;
}

void error_handling(char * message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}

0 个答案:

没有答案