C中的Windows套接字编程

net*_*oob 4 c sockets windows networking tcp

我正在上一个网络课,教授在课堂上正在读这本书.不用说我不知道​​我在做什么.我们的学期项目是从我们的教科书中复制代码并建立一个客户端 - 服务器网络.从字面上复制代码而不做任何修改.

这本书在代码中有错误(缺少分号,额外的paranthesis),但我设法至少编译代码.但是,我遇到了一堆链接错误.

示例:错误1错误LNK2019:未解析的外部符号impsendto @ 24在函数_main C中引用:\ Users\Documents\Visual Studio 2010\Projects\Client_Server\Client_Server\Client_Server\Server.obj Client_Server

我查找了错误代码,我认为代码正在尝试链接到头文件中不存在的定义.我很难修复LNK错误与语法错误.但就像我说的,我不知道如何解决这个问题.我正在为服务器端发送代码,我在客户端遇到了同样的错误.

include <stdio.h>
include <string.h>
include <WinSock2.h>
include <WinSock.h>
include <stdint.h>
include <time.h>

int main(void) {

int s;      
int len;
char  buffer[256];  
struct sockaddr_in servAddr; 
struct sockaddr_in clntAddr; 

int clntAddrLen; //length of client socket addre

//Build local (server) socket add

memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(21);
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

   //create socket
if((s=socket(PF_INET, SOCK_DGRAM, 0) <0 ))
{
   perror("Error: Socket Failed!");
    exit(1);
}

//bind socket to local address and port
if((bind(s,(struct sockaddr*)&servAddr, sizeof(servAddr))<0))
{
    perror("Error:bind failed!");
    exit(1);
}

for(;;)
{
len = recvfrom(s,buffer, sizeof(buffer),0,(struct sockaddr*)&clntAddr, &clntAddrLen);

    //send string
    sendto(s, buffer, len, 0, (struct sockaddr*)&clntAddr, sizeof(clntAddr));
}

}
Run Code Online (Sandbox Code Playgroud)

任何提示,有用信息的链接或建议将不胜感激.我试过阅读教科书,但我完全迷失了.此外,这是我们在整个学期完成的唯一与代码相关的作业.其他一切都是使用数据包嗅探器收集数据包.字面上进入课堂,并在第X页上说复制和运行代码.

bdo*_*lan 6

您需要链接库Ws2_32.lib以使用winsock.您还必须在使用任何其他winsock函数之前调用WSAStartup(这不会导致您当前的错误,但是一旦修复了丢失的库问题就会导致问题).


小智 5

首先,我将尝试使用您的最后评论:假设您使用的是Visual Studio(我认为这是启动Windows编程Winsock的最佳选择,因为Microsoft关心Windows基本库是最新的,并且它们与msdn支持)。

如果遇到这样的错误:1> asdf.obj:error LNK2001:无法解析的外部符号_ imp _WSAStartup @ 8,则表示ws2_32.lib未正确链接。为此,请在解决方案资源管理器中右键单击您的项目,转到链接器->输入,然后将ws2_32.lib添加到其他依赖项中。该库是Windows SDK的一部分(我想它与大多数版本的Visual Studio一起安装),因此请确保文件在您的计算机上存在。

现在如何在不遵循古代教程的情况下以现代风格制作正确的项目:

您需要添加的库是Winsock2.h。Winsock.h是旧版本(不建议使用),无需在新应用程序中使用它。要开始使用套接字,您需要调用函数WSAStartup,为此必须在开始时初始化结构WSADATA。基本代码如下所示:

#include <Winsock2.h>
int main()
{
WSADATA mywsadata; //your wsadata struct, it will be filled by WSAStartup
WSAStartup(0x0202,&mywsadata); //0x0202 refers to version of sockets we want to use.
//here goes your code with socket related things
return 0;
}
Run Code Online (Sandbox Code Playgroud)

如需更多帮助,请访问此处

注意:由于问题很旧,我不确定它的作者会不会对我的回答有所帮助,所以我想帮助其他用户查看此问题


小智 5

下面是一个简单的套接字程序(简单的http客户端),可以在Windows和Linux上运行。如果您使用“gcc on windows”,那么您需要使用以下命令进行编译:

gcc prog_name.c -lws2_32
Run Code Online (Sandbox Code Playgroud)

代码:

gcc prog_name.c -lws2_32
Run Code Online (Sandbox Code Playgroud)