Python 与 C++ (Winsock) 中的 Socket 编程问题和解决方案

用户希望构建一个能够通过互联网进行聊天的程序,他使用 Python 语言成功实现了这个功能,但当他尝试使用 C++ 的类似 socket 时,却遇到了问题,无法通过互联网进行连接。用户提供了 Python 和 C++ 程序的代码,并希望寻求帮助以解决这个问题。
在这里插入图片描述

2、解决方案

根据用户提供的代码,可以看出 C++ 程序中存在一些问题,导致它无法通过互联网进行连接。以下是问题的解决方案:

  1. 检查 IP 地址和端口号
    • 确保在 C++ 程序中,接收方和发送方的 IP 地址和端口号正确无误。用户在 Python 程序中使用的是 59.95.18.156 的 IP 地址,但在提供 C++ 程序的代码时却使用了 123.456.789.1。这可能会导致 C++ 程序无法连接到正确的目的地。
  2. 检查防火墙设置
    • 确保防火墙允许 C++ 程序通过 3000 端口进行通信。如果防火墙阻止了 C++ 程序的连接,那么它将无法通过互联网进行聊天。
  3. 检查 sendto 函数的返回值
    • 在 C++ 程序中,sendto 函数用于发送数据。sendto 函数的返回值可以用来检查发送是否成功。如果 sendto 函数返回一个负值,则说明发送失败。用户需要检查 sendto 函数的返回值,以确保数据已被成功发送。
  4. 检查 recvfrom 函数的返回值
    • 在 C++ 程序中,recvfrom 函数用于接收数据。recvfrom 函数的返回值可以用来检查接收是否成功。如果 recvfrom 函数返回一个负值,则说明接收失败。用户需要检查 recvfrom 函数的返回值,以确保数据已被成功接收。

以下是修改后的 C++ 代码:

#include <stdio.h>
#include "winsock2.h"

void main() {

WSADATA wsaData;
SOCKET SendSocket;
SOCKET RecvSocket;
sockaddr_in RecvAddr;
sockaddr_in SenderAddr;
int Port = 3000;
char SendBuf[3]={'a','2','\0'};
int BufLen = 3;
int SenderAddrSize = sizeof(SenderAddr);

// Initialize Winsock
WSAStartup(MAKEWORD(2,2), &wsaData);

// Create a socket for sending data
SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

// Create a socket for receiving data
RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

// Set up the RecvAddr structure with the IP address of
// the receiver (in this example case "59.95.18.156")
// and the specified port number.
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(Port);
RecvAddr.sin_addr.s_addr = inet_addr("59.95.18.156");

// Bind the socket to any address and the specified port.
bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));

// Send a datagram to the receiver
int sendResult = sendto(SendSocket, SendBuf, BufLen, 0, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
if (sendResult < 0) {
    printf("Failed to send data. Error code: %d\n", WSAGetLastError());
}

// Receive a datagram from the sender
int recvResult = recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize);
if (recvResult < 0) {
    printf("Failed to receive data. Error code: %d\n", WSAGetLastError());
} else {
    printf("Received data: %s\n", RecvBuf);
}

// Close the sockets
closesocket(SendSocket);
closesocket(RecvSocket);

// Clean up and exit.
printf("Exiting.\n");
WSACleanup();
return;
}

修改后的 C++ 程序应该能够通过互联网进行聊天。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值