在windows下用C语言如何实现socket网络编程,需要用到哪些头文件或者库?

在windows下用C语言如何实现socket网络编程,需要用到哪些头文件或者库?,第1张

需要用到的头文件包含:

#include <winsock2.h>

#include <windows.h>

与Linux环境下socket编程相比,windows环境多了一个步骤:启动或者初始化winsock库

Winsock,一种标袜如铅准API,一种网络编程接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本:

Winsock 1:

Windows CE平台支持。

头文件:WinSock.h

库:wsock32.lib

Winsock 2:

部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个橡山别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数;

头文件:WinSock2.h

库:ws2_32.lib

mswsock.h用于编程扩展,使用时必须链接mswsock.dll

扩展资料

winsock库的加载与卸载:

加载:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)

加载成功,返回值为0。

WORD wVersionRequested:加载的winsock版本,使用宏MAKEWORD(x, y),x表示高字节,y表示低字节。然而使用时MAKEWORD(2, 2)。高字节与低字节相同~~

LPWSADATA lpWSAData:WSADATA结构告好的指针,传入参数后,系统帮助我们填充版本信息。有兴趣的可以看看结构体内容,不过基本用不着。

卸载:int WSACleanup(void)比起加载,卸载的函数真是轻松愉快。

三、解决方法

        1、修改应用程序代码,一直 recvfrom 收数据,netbuf 用完即释放。

        2、修改 base,将 netbuf 数量改大或者消息队列长度改小(消息队列长度改缺瞎枣小如果接收速度慢可能会丢数)。

        修神厅改 netbuf 的头文件在 libsylixos/SylixOS/config/net/ 目录下的 net_perf_cfg.h。第 34 行 LW_CFG_LWIP_MSG_SIZG 为一个套接字最大伏拆的消息队列长度,第39行 LW_CFG_LWIP_NUM_NETBUF 为系统总的 netbuf 数量。

具体配置过程:

1、打开STM32CubeMX,并选择好相应的芯片。文中的芯片为STM32F207VCT6,选择后如下图:

2、配置RCC时钟、ETH、PA8以及使能LWIP;

由于此处我们的开发板硬件上为RMII方式,因此选择ETH-RMII,若有同志的开发板为MII方式,请参考MII的配置方法,谈喊铅此处只针对RMII;

RCC选择外部时钟源,另外勾选MCO1,软件会自动将PA8配置为MCO1模式,该引脚对于RMII方式很重要含好,用于为PHY芯片提供50MHz时钟;

使能LWIP;

3、时钟树的相关配置,必须保证MCO1输出为50Mhz,如果这个频率不对会导致PHY芯片无法工作;

我这里因为芯片为207VCT6,为了使MCO1输出为50Mhz,做了PLL倍频参数的一些调整,总体如下:(同志们配置时可根据自己的芯片灵活配置,但需保证MCO1的输出为50Mhz)

4、ETH、LWIP、RCC相关参数设置;

至此,比较重要的都在前面了,但是还有一点仍需要注意,即PA8引脚输出速度,几次不成功都是因为这个引脚没注意。

后续的参数设置可以根据同志们自己的需求分别设置,这里给出我的设置供参考;

ETH参数保持默认,但中断勾选一下;

LWIP参数设置如下:(因为我这里是配置UDP服务器,IP选择静态分配)

5、生成工程,做最后的函数修改;

给生成的工程添加UDP服务器的初始化以及端口绑定等相关函数;

我这里直接将之前的官方例程中的UDP服务器文件加进来,如下:

之后将.c文件添加到用户程序,主函数添加Udp的.h头文件;如下:(udp文件的具体内容在后面给出)

6、主函数还需要添加一下几个函数,在这渗虚里不对函数作用及实现原理讲解,仅做添加说明。

附:udp_echoserver相关文件内容(该文件为官方的示例程序,版权归官方,此处做转载)

udp_echoserver.c的内容如下:

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "lwip/pbuf.h"

#include "lwip/udp.h"

#include "lwip/tcp.h"

#include

#include

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

#define UDP_SERVER_PORT 7 /* define the UDP local connection port */

#define UDP_CLIENT_PORT 7 /* define the UDP remote connection port */

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)

/* Private functions ---------------------------------------------------------*/

/**

* @brief Initialize the server application.

* @param None

* @retval None

*/

void udp_echoserver_init(void)

{

struct udp_pcb *upcb

err_t err

/* Create a new UDP control block */

upcb = udp_new()

if (upcb)

{

/* Bind the upcb to the UDP_PORT port */

/* Using IP_ADDR_ANY allow the upcb to be used by any local interface */

err = udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT)

if(err == ERR_OK)

{

/* Set a receive callback for the upcb */

udp_recv(upcb, udp_echoserver_receive_callback, NULL)

}

}

}

/**

* @brief This function is called when an UDP datagrm has been received on the port UDP_PORT.

* @param arg user supplied argument (udp_pcb.recv_arg)

* @param pcb the udp_pcb which received data

* @param p the packet buffer that was received

* @param addr the remote IP address from which the packet was received

* @param port the remote port from which the packet was received

* @retval None

*/

void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)

{

/* Connect to the remote client */

udp_connect(upcb, addr, UDP_CLIENT_PORT)

/* Tell the client that we have accepted it */

udp_send(upcb, p)

/* free the UDP connection, so we can accept new clients */

udp_disconnect(upcb)

/* Free the p buffer */

pbuf_free(p)

}

udp_echoserver.h的内容如下:

#ifndef __ECHO_H__

#define __ECHO_H__

void udp_echoserver_init(void)

#endif /* __MINIMAL_ECHO_H */

7、至此,所有的工作完成,编译工程,下载至开发板。由于udp_echoserver中绑定的端口号为7,这里我们通过测试工具测试网络的功能,


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12300980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存