无法建立服务器客户端连接-c winsock中出现错误10061

无法建立服务器客户端连接-c winsock中出现错误10061,c,eclipse,windows,client-server,winsock,C,Eclipse,Windows,Client Server,Winsock,我正在尝试在家中本地网络中的两台计算机上运行服务器客户端。 第一台计算机是服务器,第二台是客户端 尝试连接服务器时出现错误10061。(“错误-连接失败。sockfd为164,errno为34,WSA为10061”)。 错误10061表示“连接被拒绝。无法建立连接,因为目标计算机主动拒绝它。这通常是由于尝试连接到外部主机上处于非活动状态的服务,即没有运行服务器应用程序的服务。” 我认为这可能是防火墙的问题,所以我在防火墙中批准了我使用的端口,但它仍然不起作用。 而且,两台计算机都有相同的IP(为

我正在尝试在家中本地网络中的两台计算机上运行服务器客户端。 第一台计算机是服务器,第二台是客户端

尝试连接服务器时出现错误10061。(“错误-连接失败。sockfd为164,errno为34,WSA为10061”)。 错误10061表示“连接被拒绝。无法建立连接,因为目标计算机主动拒绝它。这通常是由于尝试连接到外部主机上处于非活动状态的服务,即没有运行服务器应用程序的服务。”

我认为这可能是防火墙的问题,所以我在防火墙中批准了我使用的端口,但它仍然不起作用。 而且,两台计算机都有相同的IP(为什么?)

这是我的密码:

服务器c:

#include <sys/types.h>
#include <signal.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <tchar.h>


int socketBind(int sockfd, int port){
    struct sockaddr_in serv_addr;
    ZeroMemory((char*) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(port);
    if ( bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 ){
        // we can check errno for exact ERROR
        printf("bind failed with errno %d\n",errno);fflush(NULL);
        return ERROR;
    }
    if ( listen(sockfd, 100) == -1 ){
        return ERROR;
    }
    return 1;
}

int main()
{
    WSADATA wsaData;

        if (WSAStartup(MAKEWORD(2,2), &wsaData) == SOCKET_ERROR) {
            printf ("Error initialising WSA.\n");
            return -1;
        }
    int sockfd; // server's listening socket's descriptor id
    int port = 4997;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    while ( sockfd < 0 ){ // ERROR
        printf("Listener socket creation failed with:%d, errno is %d\n",sockfd,errno);fflush(NULL);
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
    }
    if ( socketBind(sockfd, port) == ERROR ){
        printf("Socket bind failed with errno=%d\n",errno);fflush(NULL);
        close(sockfd);
        return ERROR;
    }
    printf("Starting to listen to other USERS!\n");fflush(NULL);
    struct sockaddr_in cli_addr;
    int clilen = sizeof(cli_addr); // length of address
    // accept() returns the socket that will be used for Control Connection with the accepted client
    printf("*************Waiting for other USERS************\n");fflush(NULL);
    int newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
    int readLength;
    char command[(128+1)];
    while(1)
    {
        ZeroMemory(command, sizeof(command));
        readLength = read(newsockfd, command, 128+1);
        if(readLength <= 0)
        {
            continue;
        }
        if(readLength > 0)
        {
            printf(" here should be API's func to command %s", command);fflush(NULL);
        }
        else
        {
            close(sockfd);
            close(newsockfd);
            WSACleanup();
            printf("Read failed with errno:%d\n",errno);fflush(NULL);
            return ERROR;
        }
    }
    close(sockfd);
    close(newsockfd);
    WSACleanup();
    return 1;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int-socketBind(int-sockfd,int-port){
服务地址中的结构sockaddr\u;
零内存((char*)&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=INADDR_ANY;
serv_addr.sin_port=htons(端口);
if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0){
//我们可以检查errno是否存在确切的错误
printf(“绑定失败,错误号为%d\n”,错误号);fflush(NULL);
返回误差;
}
如果(监听(sockfd,100)=-1){
返回误差;
}
返回1;
}
int main()
{
WSADATA WSADATA;
if(WSAStartup(MAKEWORD(2,2),&wsaData)=套接字错误){
printf(“初始化WSA时出错。\n”);
返回-1;
}
int sockfd;//服务器的侦听套接字的描述符id
int端口=4997;
sockfd=套接字(AF_INET,SOCK_STREAM,0);
而(sockfd<0){//错误
printf(“侦听器套接字创建失败,错误为:%d,错误号为%d\n”,sockfd,错误号);fflush(NULL);
sockfd=套接字(AF_INET,SOCK_STREAM,0);
}
if(socketBind(sockfd,端口)=错误){
printf(“套接字绑定失败,错误号=%d\n”,错误号);fflush(NULL);
关闭(sockfd);
返回误差;
}
printf(“开始侦听其他用户!\n”);fflush(NULL);
cli_addr中的结构sockaddr_;
int clilen=sizeof(cli_addr);//地址长度
//accept()返回将用于与接受的客户端进行控制连接的套接字
printf(“*************正在等待其他用户*********\n”);fflush(NULL);
int newsockfd=accept(sockfd,(struct sockaddr*)&cli\u addr,&clilen);
int readLength;
char命令[(128+1)];
而(1)
{
零内存(命令,sizeof(命令));
readLength=read(newsockfd,命令,128+1);
if(readLength 0)
{
printf(“这里应该是API的func to命令%s”,command);fflush(NULL);
}
其他的
{
关闭(sockfd);
关闭(newsockfd);
WSACleanup();
printf(“读取失败,错误号:%d\n”,错误号);fflush(NULL);
返回误差;
}
}
关闭(sockfd);
关闭(newsockfd);
WSACleanup();
返回1;
}
客户c:

#include <sys/types.h>
#include <signal.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <tchar.h>

int verifyWrite(int sockfd, char* command){
    int size = strlen(command);
    int i=0, x=0;
    for(i=0;i<size;){
        x = write(sockfd, command, size);
        if(x < 0){
            return ERROR;
        }
        if(x >= 0) {
            i += x;
        }
    }
    return 0;
}

int sendToAll(char* message, int sockfd)
{
    if ( verifyWrite(sockfd, message) < 0 )
    {
        printf("error while sending message\n");fflush(NULL);
    }
    return 0;
}

int main()
{
    WSADATA wsaData;

        if (WSAStartup(MAKEWORD(2,2), &wsaData) == SOCKET_ERROR) {
            printf ("Error initialising WSA.\n");
            return -1;
        }
    int port,sockfd;
    struct sockaddr_in serv_addr;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);       //creating control connection
    while(sockfd < 0){
        printf("error - sockfd = %d\n",sockfd);fflush(NULL);
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
    }
    port = 4997;
    ZeroMemory((char*)&serv_addr, sizeof(serv_addr));
    serv_addr.sin_addr.s_addr = inet_addr("192.168.1.20");
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port);
    while(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0){
        printf("error - connect failed. sockfd is %d, errno is %d, WSA is %d\n",sockfd,errno,WSAGetLastError());fflush(NULL);
    }
    printf("\n opened connection to %s\n", "192.168.1.20");fflush(NULL);

    int i = 0;
    while(i< 6)
    {
        sendToAll("just a message", sockfd);
        i++;
    }
    WSACleanup();

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int verifyWrite(int sockfd,char*命令){
int size=strlen(命令);
int i=0,x=0;
对于(i=0;i=0){
i+=x;
}
}
返回0;
}
int sendToAll(字符*消息,int sockfd)
{
如果(验证写入(sockfd,消息)<0)
{
printf(“发送消息时出错”);fflush(NULL);
}
返回0;
}
int main()
{
WSADATA WSADATA;
if(WSAStartup(MAKEWORD(2,2),&wsaData)=套接字错误){
printf(“初始化WSA时出错。\n”);
返回-1;
}
int端口,sockfd;
服务地址中的结构sockaddr\u;
sockfd=socket(AF_INET,SOCK_STREAM,0);//正在创建控制连接
而(sockfd<0){
printf(“错误-sockfd=%d\n”,sockfd);fflush(NULL);
sockfd=套接字(AF_INET,SOCK_STREAM,0);
}
端口=4997;
零内存((char*)&serv_addr,sizeof(serv_addr));
serv_addr.sin_addr.s_addr=inet_addr(“192.168.1.20”);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(端口);
而(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0){
printf(“错误-连接失败。sockfd是%d,errno是%d,WSA是%d\n”),sockfd,errno,WSAGetLastError();fflush(NULL);
}
printf(“\n打开了与%s的连接\n”,“192.168.1.20”);fflush(NULL);
int i=0;
而(i<6)
{
sendToAll(“只是一条消息”,sockfd);
i++;
}
WSACleanup();
返回0;
}

您的服务器正在侦听端口4997,但您的客户端正在连接端口80。如果在控制台的调试输出中包含侦听和连接IP:端口对,您会发现这一点。

“而且,两台计算机都有相同的IP”-我希望不会!如果这两个盒子有相同的IP地址,你的工作就会有大问题。我知道。很奇怪,这是一个复制粘贴错误(因为服务器和客户端运行在两台Diverenet计算机上,我从其中一台计算机复制了文件)。我试着用端口号玩游戏,但它还是给了我同样的错误。在这两个端口中,我总是输入相同的端口号