我尝试在mingw上创建一个UDP套接字,但是socket()返回-1,使用errno = 0.奇怪.我已经包含了winsock2.h.最初我有编译错误undefined reference to socket@12,在设置
-lws2_32和-lwsock32Code :: Block的链接器设置后,编译成功.
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
RDF_LOG(kDEBUG, "sockfd %d ", sockfd);
if (sockfd < 0){
RDF_LOG(kERROR, "ERROR: %s , errno %d\n", strerror(errno), errno);
}
Run Code Online (Sandbox Code Playgroud)
结果 - > sockfd -1错误:没有错误,错误0
好的,我改为将RDF_LOG更改为fprintf.
int tmp = 0;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
tmp = errno;
fprintf(stderr, "sockfd %d ", sockfd);
if (sockfd < 0){
fprintf(stderr, "socket: %s , errno %d\n", strerror(tmp), tmp);
}
Run Code Online (Sandbox Code Playgroud)
返回的结果仍然是 - …
我在C中编写一个使用winsock的程序,我使用命令fcntl使接收调用非阻塞,我收到以下错误.
warning C4013: 'fcntl' undefined; assuming extern returning int
error C2065: 'F_SETFL' : undeclared identifier
error C2065: 'F_GETFL' : undeclared identifier
error C2065: 'F_SETFL' : undeclared identifier
error C2065: 'O_NDELAY' : undeclared identifier
error C2065: 'EWOULDBLOCK' : undeclared identifierenter code here
Run Code Online (Sandbox Code Playgroud)
我在我的代码中包含winsock2.h头文件,如下所示
#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
Run Code Online (Sandbox Code Playgroud)
请帮帮我.提前致谢.
我正在用C++编写一个小DLL,它将从Web服务器下载文件.下载部分工作正常,但是当我在磁盘上写入文件时,它会在每一行添加额外的字符.
当我在Notepad ++中查看原始文件(复制到Web服务器上的文件)时,我可以看到它在每行末尾都有CR和LF(回车符和换行符)字符.但是,在保存的版本上,而不是
line of textCRLF
Run Code Online (Sandbox Code Playgroud)
看起来像
line of textCR
CRLF
CR
CRLF
Another line of text...
Run Code Online (Sandbox Code Playgroud)
我一直无法找到导致它的原因.这是(o)fstream的某种问题吗?
extern "C" void TCP_get_file(char *server, char *path, char *filename){
ofstream logfile("Crashlog.txt");
WSAData wsadata;
if ((WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0){
logfile << "Error starting winsocks." << endl;
WSACleanup();
return;
}
int status, sock, received;
struct addrinfo hints, *servinfo;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((status = getaddrinfo(server, "http", &hints, &servinfo)) != 0){
logfile << "Error getting server info: …Run Code Online (Sandbox Code Playgroud) 我一直在学习如何通过C++在windows中对网络进行编程,除了遇到一个我现在无法解决大约3-4天的问题,我正在使用Dev-C++ 5.5.3(Orwell),编译器是TDM-GCC 4.7.1.我在链接器参数中添加了"-lwsock32"(不带引号).除了"freeaddrinfo"和"getaddrinfo"之外,所有这些都很有效,这里是其中2个函数的说法.
未定义引用` imp _getaddrinfo @ 16'
未定义引用` imp _freeaddrinfo @ 4'
我在某处读过它需要我定义我想要使用的windows版本,所以我根据需要定义了_WINNT_WIN32 0x0601,但没有用. 这是我的代码(缩短):
#define _WINNT_WIN32 0x0601
#include <ws2tcpip.h>
#include <winsock2.h>
#include <stdio.h>
#define DEFAULT_PORT "27015"
// server
int main()
{
WSADATA wsaData;
ZeroMemory(&wsaData,sizeof(wsaData));
int nResult = WSAStartup(MAKEWORD(2,2),&wsaData);
if(nResult != 0)
{
printf(TEXT("WSAStartup function failed, value: %d\n"),nResult);
Sleep(5000);
return 0001;
}
else
printf(TEXT("WSAStartup function has succeeded! value: %d\n"),nResult);
struct addrinfo *result = …Run Code Online (Sandbox Code Playgroud) 我可以清楚地看到recvbuf所有数据都在我期望的范围内,但是select()一直返回1。
现在,它陷入了困境else if (iBuffer == 0) {}。
SOCKET m_ConnectSocket;
/* The socket setup is done elsewhere but just adding this for clarity
This socket is responsible for sending from the client to the server
and also receives anything the server sends back.
This socket is doing the connect() & initial send()
*/
fd_set set;
struct timeval timeout;
// Set up the file descriptor set.
FD_ZERO(&set);
FD_SET(m_ConnectSocket, &set);
// Set up the struct timeval for …Run Code Online (Sandbox Code Playgroud) 我很难理解为什么这段代码让我的电脑发出哔哔声.我已经将这部分代码隔离开来,偶尔发出哔哔声,但我看不出它有什么问题.
const int BUFFER_LENGTH = 8192;
char buffer [BUFFER_LENGTH + 1];
int recvResult;
do
{
recvResult = recv(webSocket, buffer, BUFFER_LENGTH, 0);
buffer[recvResult] = '\0';
printf("%s", buffer);
if (recvResult > 0)
{
sendResult = send(clientSocket, buffer, recvResult, 0);
}
}while (recvResult > 0);
shutdown(webSocket, SD_SEND);
Run Code Online (Sandbox Code Playgroud)
为了给出一点上下文,这是一个计算机网络类,我们必须在其中编写代理.所以我正在做的是听取答案,然后将其转发给客户.
当我第一次听到哔哔声时,我无法告诉你我从椅子上跳了多高......
我正在使用Winsocks 2.2编写一个使用Visual Studio 2010的C++网络游戏,并决定使用我的网络服务器存储游戏的活动服务器列表是个好主意.当服务器启动时,它将在我的Web服务器上注册,退出时取消注册; 当有人访问服务器列表时,服务器本身将尝试清理列表(这种行为我仍在设计不涉及服务器上的太多工作;但我想当游戏服务器试图添加自己时,我的php文件将使用fsockopen来检测它是否可以从外部网络实际访问服务器,如果没有,服务器将无法添加,直到它可以正确设置端口转发或以某种方式解决问题).
好的,经过一些研究,我想出了如何使用TCP连接从服务器获取某些东西来格式化HTTP服务器的专用消息.这就是我所拥有的:
if(FAIL == Connection::Get_Connection(&m_Connection, networkSettings.ServerListAddress, 80))
{
return FAIL;
}
m_Connection.SendMsg("GET /servers.php HTTP/1.1\r\nHost: cyclotron.leetnightshade.com\r\nUser-Agent: CycloTron\r\n\r\n");
Run Code Online (Sandbox Code Playgroud)
我期待回到格式正确的数据,我并没有完全得到.这是我得到的:
2f
Server Count:1
129.21.138.1,40000,Depth of Hell
0
Run Code Online (Sandbox Code Playgroud)
这是一些带有所有头信息的垃圾的另一个输出:
HTTP/1.1 200 OK
Date: Tue, 12 Apr 2011 23:23:11 GMT
Server: Apache
X-Powered-By: PHP/5.2.17
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=8254688ee345202bd177d57e4ba339b2; path=/
Set-Cookie: PHPSESSID=73eae89f61e7268f433af9bdfe299173; path=/
Set-Cookie: PHPSESSID=8fb5d6fd9f1023bb00290b4daa3c7952; path=/
Connection: close
Transfer-Encoding: chunked
Content-Type: text; charset=us-ascii
e
Server Count:1
21
129.21.138.1,40000,Depth of …Run Code Online (Sandbox Code Playgroud) 我遇到了广播问题:我可以发送消息,接收者接收并发送回,但我无法得到这些响应。不过,它显示在wireshark 上,所以它就在那里。
这是我在发件人端所做的:
但是我没有在那个 recv 中得到响应,即使它显示在 Wireshark 上并且它没有被计算机拒绝(没有 ICMP 消息)。
这个过程有什么问题,还是我看的地方不对?
(顺便说一句,当不使用广播选项和目标 IP 时,它工作正常)
根据此页面:
select 函数返回就绪且包含在 fd_set 结构中的套接字句柄总数。
SOCKET如果我只向每个FD_SETs 添加一个(且相同)并将它们传递给 ,那么理论上返回值是否可能大于 1 select?这意味着我必须在同一个套接字上处理多个事件。例子:
SOCKET someRandomSocket;
FD_SET readfds;
FD_SET writefds;
FD_SET exceptfds;
timeval timeout;
/* ...
Connecting someRandomSocket to another peer.
... */
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);
FD_SET(someRandomSocket, &readfds);
FD_SET(someRandomSocket, &writefds);
FD_SET(someRandomSocket, &exceptfds);
int total = select(0, &readfds, &writefds, &exceptfds, &timeout);
/* total > 1 is possible? */
/* (FD_ISSET(someRandomSocket, &exceptfds) && (FD_ISSET(someRandomSocket, &readfds) || FD_ISSET(someRandomSocket, &writefds)) == true) possible? */
Run Code Online (Sandbox Code Playgroud)
还有一个问题:是否有可能发生我必须同时处理同一个套接字上的异常和非异常事件的情况?
我创建了一个简单的代码来连接到Gmail SMTP服务器,但该函数connect()返回-1 (SOCKET_ERROR).这段代码出了什么问题?
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
int main()
{
WSADATA wsaData;
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("smtp.gmail.com");
addr.sin_port = htons(587);
//WSA STARTUP
if (WSAStartup(MAKEWORD(2, 2), &wsaData))
{
std::cout << "Failed to startup wsa.\n";
return 1;
}
// GNIAZDO DLA KLIENTA
SOCKET mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (mSocket == INVALID_SOCKET)
{
std::cout << "Socket error: " << WSAGetLastError();
WSACleanup();
return 1;
}
//LACZENIE Z SERWEREM
int status = connect(mSocket, (SOCKADDR*)&addr, sizeof(addr)); …Run Code Online (Sandbox Code Playgroud) winsock2 ×10
c++ ×7
c ×3
sockets ×3
select ×2
winapi ×2
windows ×2
broadcast ×1
codeblocks ×1
http-headers ×1
mingw ×1
networking ×1
smtp ×1
tcp ×1
udp ×1
winsock ×1
winsockets ×1