- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试用 winsock2 编写一个简单的服务器。我无法正确编译它。
#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include "dump.h"
#pragma comment(lib,"WS2_32.lib")
#define PORT 7890
int main(void)
{
//fd --> file descriptor
int sockfd, new_sockfd; //warten an sockfd, neue Verbindung an new_sockfd
struct sockaddr_in host_addr, client_addr; //Addressinformationen
//sockaddr_in aus winsock.h
//Laenge des Inputs --> winsock Alternative suchen
socklen_t sin_size;
int recv_length = 1, yes = 1;
char buffer[1024];
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
//PF_INET --> Protocol family
//AF_INET --> Addres family
printf("%s\n", "in socket");
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(int)) == -1)
printf("%s\n", "setting socket option SO_REUSEADDR");
//vorbereiten auf den bind-Befehl
host_addr.sin_family = AF_INET;
host_addr.sin_port = htons(PORT);
//htons --> host to network short
//Wandelt bei 16 Bit int Hostbytereihenfolge in Netzwerkbytereihenfolge
host_addr.sin_addr.s_addr = 0; //Automatisch mit meiner IP fuellen
memset(&(host_addr.sin_zero), '\0', 8); // Rest der Struktur mit 0 fuellen
if (bind(sockfd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1)
printf("%s\n", "binding to socket");
if (listen(sockfd, 5) == -1)
{
printf("%s\n", "listening on socket");
}
//Schleife um am PORT zu lauschen und Verbindungen zu akzeptieren
while (1)
{
sin_size = sizeof(struct sockaddr_in);
//accept gibt neuen sockfd zurueck !
new_sockfd =
accept(sockfd, (struct sockaddr *) &client_addr, &sin_size);
if (new_sockfd == -1)
{
printf("%s\n", "accepting connection");
}
printf("server: got connection from %s port %d\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
send(new_sockfd, "Hello, world!\n", 13, 0);
recv_length = recv(new_sockfd, buffer, 1024, 0);
while (recv_length > 0)
{
printf("RECV: %d bytes \n", recv_length);
dump(buffer, recv_length);
recv_length = recv(new_sockfd, buffer, 1024, 0);
}
closesocket(new_sockfd);
}
return 0;
}
它最初是用于 Linux 的 socket.h,但我试图在 windows7 下用 winsock2 实现它。我手动安装了 Windows SDK 并找到了我必须链接的库 Ws2_32.lib。我在 CLION 中使用 gcc (mingw32) 进行编译。我设置了参数标志
-lws2_32 -lwsock32
我知道这里有很多帖子回答了这个问题,但似乎没有一个对我有用。
CLION 的输出:
"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" --build C:\Users\Marcel\Desktop\Projekte\C-Projekte\Sequenz-Uebungen\Simple_Server\cmake-build-debug --target Simple_Server -- -j 2
[ 50%] Linking C executable Simple_Server.exe
CMakeFiles\Simple_Server.dir/objects.a(main.c.obj): In function `main':
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:49: undefined reference to `socket@12'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:53: undefined reference to `setsockopt@20'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:58: undefined reference to `htons@4'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:64: undefined reference to `bind@12'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:66: undefined reference to `listen@8'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:78: undefined reference to `accept@12'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:84: undefined reference to `ntohs@4'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:83: undefined reference to `inet_ntoa@4'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:85: undefined reference to `send@16'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:86: undefined reference to `recv@16'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:91: undefined reference to `recv@16'
C:/Users/Marcel/Desktop/Projekte/C-Projekte/Sequenz-Uebungen/Simple_Server/main.c:93: undefined reference to `closesocket@4'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\Simple_Server.dir\build.make:95: recipe for target 'Simple_Server.exe' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/Simple_Server.dir/all' failed
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/Simple_Server.dir/rule' failed
mingw32-make.exe[3]: *** [Simple_Server.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/Simple_Server.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/Simple_Server.dir/rule] Error 2
Makefile:117: recipe for target 'Simple_Server' failed
mingw32-make.exe: *** [Simple_Server] Error 2
我现在使用以下命令用 gcc 编译:
gcc -Wl,-verbose -lws2_32 -lwsock32 -o simple_server main.c > linker.txt
它给出以下输出:
==================================================
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../crt2.o succeeded
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../crt2.o
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtbegin.o succeeded
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/crtbegin.o
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/ws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/ws2_32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/ws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0\libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/libws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/ws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/ws2_32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/libws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/ws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc\libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/ws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/ws2_32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/ws2_32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib\libws2_32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../ws2_32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libws2_32.a succeeded
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libwsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/wsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/wsock32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/libwsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/wsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0\libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/libwsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/wsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/wsock32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/libwsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/wsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc\libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libwsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/wsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/wsock32.lib failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/libwsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib/wsock32.dll failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/lib\libwsock32.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libwsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../wsock32.dll.a failed
attempt to open c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libwsock32.a succeeded
开头是这样的:
using internal linker script:
==================================================
/* Default linker script, for normal executables */
/* Copyright (C) 2014-2017 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT(pei-i386)
SEARCH_DIR("/mingw/mingw32/lib"); SEARCH_DIR("/mingw/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");
最佳答案
首先删除 #pragma comment(lib, "WS2_32.lib")
这只是 Visual C++ 编译器指令。
第二,没有为您提供 CMakeLists.txt,您是否知道 CLion 旨在跨平台解决方案并为您指定的环境(位于 toolchain 选项卡)从 CMake 配置 make 文件。这意味着您不需要手动调用 gcc 和链接库,您所需要的只是 add_executable(myexecutable)
之后的 target_link_libraries(myexecutable ws2_32)
。
第三,您不需要 wsock32.lib
实际链接到您的项目,除非您希望向后兼容 Win95(我相信您不需要)。有关更多详细信息,请查看 this answer .
您的顶级 CMake 文件应如下所示:
# system
cmake_minimum_required(VERSION 3.6)
set(CMAKE_C_STANDARD 99)
# project
project(WinsockExample C)
# sources
set(source_files
main.c
)
# build
add_executable(${CMAKE_PROJECT_NAME} ${source_files})
target_link_libraries(${CMAKE_PROJECT_NAME} ws2_32)
关于C winsock2.h WS2_32.lib 链接 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46379610/
有没有人在 Windows 上使用 Winsock(不是 MSMQ)级别的 PGM 的经验?它看起来像是一个有用的可靠多播协议(protocol)(la TIBCO Rendezvous),我认为如果
我在 VS 2008 下使用 Winsock。 我有一个线程专门用于通过阻塞调用accept() 来接受传入的TCP 连接请求。当我的应用程序需要关闭时,我需要以某种方式解锁该线程,以便它可以执行关闭
在 KB4338830 更新后一段时间后,我们的应用程序突然持续卡住。不幸的是,应用程序无法重新启动也无法关闭,我怀疑这一切都是因为我正在使用的winsock(刚刚移植)。它是在vb.net上编写的,
我正在使用 Winsock API(不是 CAsyncSocket)来创建一个监听传入连接的套接字。 当有人尝试连接时,如何在接受连接之前获取他们的 IP 地址?我试图让它只接受来自某些 IP 地址的
服务质量 (QoS) 旨在管理带宽使用,这隐含地假设应用程序竞争该(有限)资源。这些天来,对于任何应用程序来说,这真的是一个问题吗? 它还假设 QoS 协议(protocol)和 Internet 协
我的项目使用 windows.h,其中使用了 winsock.h,我需要包含使用 winsock2 的 boost:assio。所以我收到很多错误,说 Winsock.h 已经包含在内。我可以定义 W
使用典型的 irc 客户端,我可以输入: /server localhost 6667 nick:pass 当我输入为 ZNC 配置的 nick:pass(IRC 保镖)时,我将被转发到在我的服务器/
我正在研究我面临的问题之一,与提出的问题类似 here .该问题基本上解决了客户端应用程序无法连接到数据库的问题。该解决方案似乎表明安装了与网络协议(protocol)不兼容的应用程序,我们应该卸载该
我一直在挠头,几个小时以来一直在寻找这个问题的答案。基本上我所做的就是打开一个到其他机器的套接字并从中读取数据。然后,通过传递表示套接字的 int 的 fdopen 调用,将该套接字“转换”为文件句柄
我在我的 VB6 应用程序中使用 winsock,这是我的代码: Private Sub Form_Load() With Winsock1 .Close .RemoteHo
我需要按照确定的顺序从客户端向服务器发送数据,服务器也可以按客户端发送的相同顺序接收这些数据。在下面的代码中,存在一个问题,即像下一个数据的数据一样接收数据(即控制字节 1 )。 前任: 在客户端上,
我正在开发客户端-服务器 Winsock 应用程序 (Visual C++),它应该通过网络传输各种数据(视频流、音频流、服务通知等)。我知道更简洁的方法是为每个单独的数据类型在单独的线程上使用单独的
我正在使用Microsoft Windows WinSock API拧小型HTTP服务器。 处理多个用户时是否需要应用多线程逻辑? 当前,Windows会在发生网络事件时发送一条消息,并且每条消息 (
对于我的项目,我无法调试程序,所以我无法确定为什么会出现此错误。 我的托管在 c# 上的服务器无法连接到本地主机上的服务器。 它没有向我的服务器发回“连接”信号,它永远不会连接,我认为代码写得很好,我
如何让 Winsock 程序只接受来自特定地址的连接请求?我希望被拒绝的连接被完全忽略,而不是得到 TCP 拒绝。 最佳答案 要使 Winsock 程序仅接受来自特定 IP 地址的连接,请使用 WSA
我写了一个数据包拦截器来转储来自winsock的send/recv函数的信息,据我所知,这两个函数都位于ws2_32.dll中;该钩子(Hook)是通过向一个函数写入一个 jmp 来完成的,该函数记录
我有一个简单的 winsock 程序,我想通过系统代理传递我的连接。我看到一些帖子解释了如何捕获系统代理然后发送如下字符串: CONNECT 127.0.0.1:8080 HTTP/1.0\r\n 等
我正在使用 tcp 套接字在 Windows XP 上的两个应用程序之间提供进程间通信。由于各种原因,我选择了 tcp 套接字。我看到平均往返时间为 2.8 毫秒。这比我预期的要慢得多。分析似乎表明延
我正在尝试在 Windows 下移植这个简单的 TCP echo 程序 ( https://github.com/mafintosh/echo-servers.c/blob/master/tcp-ec
过去两周我一直在学习 C,设法了解指针、数组和结构。 我想在 Windows 上进行一些套接字编程,想知道是否有人有任何提供教程和示例的网站,或者推荐一些使用 winsock 进行网络编程的书籍? 我
我是一名优秀的程序员,十分优秀!