根据您提供的代码,出现bind()
失败的原因可能是由于端口被占用或者权限不足。请确保选择一个未被占用的合法端口,并以管理员或特权用户身份运行程序。
此外,还有一处问题是在循环内部关闭了套接字clientSocket
,导致每次发送和接收数据后都会立即关闭连接。建议将关闭操作移至循环结束之后,确保在退出程序前正确关闭套接字。
以下是修改后的代码:
#include <iostream>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
using namespace std;
int main() {
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket < -1) {
cerr << "Failed to create socket." << endl;
return 1;
}
struct sockaddr_in clientAddress{};
clientAddress.sin_family = AF_INET;
clientAddress.sin_addr.s_addr = INADDR_ANY;
clientAddress.sin_port = htons(2048);
if (bind(clientSocket, reinterpret_cast<const struct sockaddr*>(&clientAddress), sizeof(clientAddress)) != 0) {
cerr << "Failed to bind address." << endl;
close(clientSocket);
return 1;
}
// 绑定远程地址
sockaddr_in remoteAddr{};
remoteAddr.sin_family = AF_INET; // IPv4地址族
remoteAddr.sin_port = htons(2048); // 远程端口号(注意字节序转换)
if (inet_pton(AF_INET, "192.168.17.132", &(remoteAddr.sin_addr)) <= 0) {
cerr << "Invalid remote address" << endl;
close(clientSocket);
return -1;
}
if (connect(clientSocket, reinterpret_cast<const struct sockaddr*>(&remoteAddr), sizeof(remoteAddr)) < 0) {
cerr << "Failed to connect address." << endl;
close(clientSocket);
return 1;
}
while (true) {
char buff[1024] = {0};
cout << "Enter string to send: ";
cin >> buff;
if (!strcmp(buff, "quit")) {
break;
}
int len = send(clientSocket, buff, sizeof(buff), 0);
if (len < 0) {
cerr << "Failed to send" << endl;
continue;
}
memset(buff, 0, sizeof(buff));
len = recv(clientSocket, buff, sizeof(buff), 0);
if (len < 0) {
cerr << "Failed to receive" << endl;
continue;
}
cout << "Received message: " << buff << endl;
}
close(clientSocket);
return 0;
}
请注意,修改后的代码将根据您提供的远程IP地址进行连接,请确保该IP地址是正确的并且可以访问。
内容由零声教学AI助手提供,问题来源于学员提问