套接字连接错误 c 套接字
Socket connect error c socket
我做了一个简单的客户端程序,它通过端口80连接到服务器;
int v=connect(mysocket,(struct sockaddr *)&server,sizeof(server));
if(v==SOCKET_ERROR){
cout<<"error connecting to server";
}
if (v==0) cout<<"connected"<<endl;
它说如果成功,连接返回 0。但是我得到错误;你能告诉我什么时候必须使用HTONL或我只用过的HTON server.sin_port=htons(80);
我应该使用server.sin_addr.s_addr=inet_addr("someip_ignorethis");
还是必须使用
server.sin_addr.s_addr=htonl(inet_addr("someip_ignorethis"));
为什么以及何时需要使用主机到网络对话的问题是什么,它如何使我的程序可移植???.我必须使用什么插座?套接字版本 2,2?谢谢你的帮助!我收到 10038 错误帮助修复我的代码
心使用调试器并自己调试代码,您会发现mySocket
变量始终为 0,因为您没有正确初始化它。
这一行:
if (mysocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET){
实际上与此相同:
if (mysocket=(socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)){
如果socket()
成功,则==INVALID_SOCKET
的计算结果为 false,因此将 0 分配给 mysocket
。 阅读运算符优先级。 ==
运算符的优先级高于=
运算符。
要修复它,请将该行更改为以下内容:
if ((mysocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
或者更好的是,摆脱在同一语句中分配和比较变量的习惯:
mysocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (mysocket==INVALID_SOCKET){
此外,如果您费心注意编译器的输出消息,您会发现您的"CONNECTED!"
消息是永远不会到达的代码,因为它位于大括号内,表示connect()
失败时,但在打印消息之前有一个return
。
请尝试以下代码:
#include <winsock2.h>
#include <iostream.h>
#include <windows.h>
//#define portnumber 80
using namespace std;
//Winsock Library
int main(int argc, char* argv[])
{
WSADATA ws = {0};
int v = WSAStartup(MAKEWORD(2,2), &ws);
if (v != 0)
{
cout << "error initialising winsock: " << v << endl;
getchar();
return 1;
}
cout << "winsock started" << endl;
SOCKET mysocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (mysocket == INVALID_SOCKET)
{
cout << "error creating socket: " << WSAGetLastError() << endl;
getchar();
return 1;
}
cout << "socket created" << endl;
struct sockaddr_in server = {0};
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("84.95.234.174");
//cout << inet_ntoa(server.sin_addr) << endl;
server.sin_port = htons(80);
if (connect(mysocket, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
{
cout << "error connecting to server: " << WSAGetLastError() << endl;
getchar();
return 1;
}
cout << "CONNECTED!" << endl;
getchar();
closesocket(mysocket);
return 0;
}
10038 是WSAENOTSOCK
。显然,socket
的价值是无效的。
您应该在发布之前自己找到所有这些,并查找错误的含义。
就个人而言,我使用它,它永远不会让我失望。
struct addrinfo *it = nullptr, *result = nullptr;
getaddrinfo(Address.c_str(), nullptr, nullptr, &result);
for (it = result; it != nullptr; it = it->ai_next)
{
sockaddr_ipv4 = reinterpret_cast<sockaddr_in*>(it->ai_addr);
Address = inet_ntoa(sockaddr_ipv4->sin_addr);
if (Address != "0.0.0.0") break;
}
freeaddrinfo(result);
我使用:
struct sockaddr_in SockAddr;
memset(&SockAddr, 0, sizeof(SockAddr));
SockAddr.sin_port = htons(Port);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = Address == "INADDR_ANY" ? htonl(INADDR_ANY) : inet_addr(Address.c_str());
if (connect(socket, reinterpret_cast<SOCKADDR*>(&SockAddr), sizeof(SockAddr)) == SOCKET_ERROR)
{
//print error.. clean up..
}
它的作用是检查地址。如果是INADDR_ANY,那么它将使用 htonl。如果没有,它使用inet_addr将地址转换为 IP。另一方面,Htonl 只是将地址转换为网络字节顺序。
- 当套接字连接断开时检测C/C++Unix
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- Opencv 不适用于套接字连接
- C++通过套接字连接发送矢量
- mbed 套接字连接需要很长时间
- 重用多个请求的相同套接字连接
- C++ Linux 上的套接字连接
- 套接字连接在主功能内部但不在功能内部
- 套接字连接上的缓冲区溢出
- 套接字连接()被误认为是QT connect()
- 返回打开的插座连接/留下套接字连接打开C
- 当试图连接到无法到达的计算机时,C 套接字连接被卡住
- C# 客户端到C++服务器 Tcp 套接字连接错误
- C [UDP]如何跟踪服务器上的所有连接(客户端)套接字连接
- 使用C 安全套接字连接
- 在C 中每分钟之后,如何检查套接字连接
- 正在创建多个TCP套接字连接
- 为什么我不能通过套接字连接android和PC
- 从分离的线程中止套接字连接