connect() 函数停止程序
connect() function stopping program
我正在编写两个应该相互连接的程序(客户端和服务器)。我终于解决了所有单独的错误,但是当我测试客户端程序(启动和服务器后)时,连接函数会停止代码的进度。我用一些简单的文本输出对此进行了测试。
这是我的服务器代码(不是很重要)
#include "stdafx.h"
using namespace std;
int main()
{
WSAData WinSockData;
WORD DLLVERSION;
DLLVERSION = MAKEWORD(2, 1);
int wsa_success = WSAStartup(DLLVERSION, &WinSockData);
if (wsa_success != 0)
{
printf("Error %d while starting WSAn", WSAGetLastError());
pause();
return 1;
}
SOCKET uc_socket;
uc_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (uc_socket == INVALID_SOCKET)
{
printf("Error %d while creating socketn", WSAGetLastError());
pause();
return 1;
}
SOCKADDR_IN ADDRESS;
int AddressSize = sizeof(ADDRESS);
ADDRESS.sin_addr.s_addr = INADDR_ANY;
ADDRESS.sin_family = AF_INET;
ADDRESS.sin_port = htons(444);
int bind_success = bind(uc_socket, (SOCKADDR *)&ADDRESS, AddressSize);
if (bind_success != 0)
{
printf("Error %d while binding socketn", WSAGetLastError());
pause();
return 1;
}
int listen_success = listen(uc_socket, 12);
if (listen_success != 0)
{
printf("Error %d while setting socket to listenn", WSAGetLastError());
pause();
return 1;
}
SOCKET c_socket;
SOCKADDR_IN client_sock;
int client_sock_size = sizeof(client_sock);
printf("Socket created; Set to listen for incoming connectionsn");
c_socket = accept(uc_socket, (SOCKADDR *)&client_sock, &client_sock_size);
if (c_socket == INVALID_SOCKET)
{
printf("Error %d while accepting connection requestn", WSAGetLastError());
pause();
return 1;
}
else
{
printf("Connection established!");
}
pause();
return 0;
}
还有我的客户端代码
#include "stdafx.h"
using namespace std;
int main()
{
int wsasuccessful = -1;
WSAData WinSockData;
WORD DLLVERSION;
DLLVERSION = MAKEWORD(2, 1);
wsasuccessful = WSAStartup(DLLVERSION, &WinSockData);
if (wsasuccessful != 0)
{
printf("Error %d in client while starting WSAn", WSAGetLastError());
pause();
return 1;
}
SOCKET client_socket;
client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (WSAGetLastError() != 0)
{
printf("Error %d in client while instantiating socketn", WSAGetLastError());
pause();
return 1;
}
SOCKADDR_IN client_connection;
client_connection.sin_family = AF_INET;
client_connection.sin_port = htons(444);
client_connection.sin_addr.S_un.S_addr = INADDR_LOOPBACK;
int connection_success = -1;
printf("before connect()n"); //for debugging
connection_success = connect(client_socket, (SOCKADDR *)&client_connection, sizeof(client_connection));
printf("after conenct()n"); //for debugging
if (connection_success != 0)
{
printf("Error %d in client while instantiating socketn", WSAGetLastError());
pause();
return 2;
}
printf("The client has found a server!");
printf("The last WSA error was: %d", WSAGetLastError());
pause();
return 0;
}
这两个程序都运行没有问题,但它们不会相互连接。我已经将我的系统配置为允许监听和连接。
服务器输出为 -已创建套接字;设置为侦听传入连接
客户端输出是 - 在 connect() 之前
我看到的问题是客户端无法识别端口 444 上的侦听套接字,并且正在阻止程序,直到可以建立连接。
我可以使用非阻塞套接字绕过它,但这并不能解决根本问题。
编辑:忘记包含我的stdafx.h
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <Inaddr.h>
#include <string.h>
#include <io.h>
#include <Windef.h>
#include <Ws2tcpip.h>
#include <WinNT.h>
#include <Windows.h>
#include <tchar.h>
void pause(void); //defined in stdafx.cpp
服务器和客户端相同
编辑 2:在服务器代码的 accept() 函数中将 SOCKADDR 更改为 SOCKADDR_IN 后,最终收到 WSA 错误 10060。
问题仍然存在,但现在至少我知道是连接失败,而不是代码。
连接是一个阻塞操作(默认情况下)。它正在尝试连接,直到工作或失败才会返回。听起来它会超时,可能是由于端口被服务器机器上的Windows防火墙阻止。你等了多久?它是否曾经完成(失败)
相关文章:
- C++调用具有 *this 属性的单个帮助程序函数
- 用于检查值是否为其任何参数的帮助程序函数
- 无法将 2D 数组传递到 c++ 中的帮助程序函数中
- C2783: 无法推断帮助程序函数的模板参数
- 友元函数需要一个帮助程序函数
- 在何处放置与类方法相关的帮助程序函数C++
- 输入处理程序函数中的分段错误
- 当要测试的函数需要用户输入时,如何制作驱动程序函数?
- 类参数化与类和帮助程序函数混淆
- 是否有一个Windows驱动程序函数可以执行Windows文件api SeFileAttributes的等效功能
- 实用程序函数不会在 .h 文件中初始化并在 main 中定义.cpp
- 在 boost::d eadline_timer 上创建包装器,无法将参数传递给处理程序函数
- boost::asio::async_read 不会回调我的处理程序函数
- 帮助程序函数应该放在标头中还是在实现文件中
- JNA 程序函数查找失败
- C++读取器函数设计:帮助程序函数、类、私有、过度工程
- 等待从获取锁的函数调用的帮助程序函数中的条件变量
- C++程序函数的一些问题
- 使用 lambda 函数定义非常小的帮助程序函数是一种好风格吗?
- 在程序函数中创建对象数组