linux网络编程 mingw,Windows网络编程

前言

因为在写代码的时候感觉用VS太过臃肿,每次写个程序还要创建一个项目,并且特别占用空间,因此安装了mingw,可以在命令行中直接gcc编译,特别方便,安利一下~

并且在编译socket程序的时候,一定要加上-l wsock32选项,因为mingw默认没有包含windows库

TCP版本

SERVER端

#include

#pragma comment(lib, "ws2_32.lib")

#include

int main(int argc, char* argv[]) {

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 2);

if (WSAStartup(sockVersion, &wsaData) != 0) {

return 0;

}

SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (sListen == INVALID_SOCKET) {

printf("socket error\n");

return 0;

}

struct sockaddr_in sin;

sin.sin_family = AF_INET;

sin.sin_port = htons(4500);

sin.sin_addr.S_un.S_addr = INADDR_ANY;

if (bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) {

printf("socket error\n");

closesocket(sListen);

return 0;

}

if (listen(sListen, 5) == SOCKET_ERROR) {

printf("socket error\n");

closesocket(sListen);

return 0;

}

struct sockaddr_in remoteAddr;

SOCKET sClient;

int nAddrLen = sizeof(remoteAddr);

char revData[255];

while(TRUE){

sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);

if (sClient == SOCKET_ERROR) {

printf("accept() error\n");

continue;

}

printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));

int ret = recv(sClient, revData, 255, 0);

if (ret > 0) {

revData[ret] = 0x00;

printf(revData);

}

char* buff = (char*)"\r\nHello, my friend\r\n";

send(sClient, buff, strlen(buff), 0);

closesocket(sClient);

}

closesocket(sListen);

WSACleanup();

return 0;

}

CLIENT端

#include

#include

#pragma comment(lib, "ws2_32.lib")

int main(int argc, char* argv[]) {

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 2);

if (WSAStartup(sockVersion, &wsaData) != 0) {

return 0;

}

SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (sClient == SOCKET_ERROR) {

printf("socket error\n");

return 0;

}

struct sockaddr_in servAddr;

servAddr.sin_family = AF_INET;

servAddr.sin_port = htons(4500);

servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

if (connect(sClient, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) {

printf("socket error\n");

closesocket(sClient);

return 0;

}

char* buff = (char*)"\r\nHello, my friend\r\n";

send(sClient, buff, strlen(buff), 0);

char revData[255];

int ret = recv(sClient, revData, 255, 0);

if (ret > 0) {

revData[ret] = 0x00;

printf(revData);

}

closesocket(sClient);

WSACleanup();

return 0;

}

编译

gcc server.c -o server -lwsock32

gcc client.c -o client -lwsock32

UDP版本

SERVER端

#include

#pragma comment(lib, "ws2_32.lib")

#include

int main(int argc, char* argv[])

{

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 2);

if (WSAStartup(sockVersion, &wsaData) != 0)

{

return 0;

}

SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (serSocket == INVALID_SOCKET)

{

printf("socket error !");

return 0;

}

struct sockaddr_in serAddr;

serAddr.sin_family = AF_INET;

serAddr.sin_port = htons(8000);

serAddr.sin_addr.S_un.S_addr = INADDR_ANY;

if (bind(serSocket, (SOCKADDR*)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)

{

printf("bind error !");

closesocket(serSocket);

return 0;

}

struct sockaddr_in remoteAddr;

int nAddrLen = sizeof(remoteAddr);

while (TRUE)

{

char recvData[255];

int ret = recvfrom(serSocket, recvData, 255, 0, (SOCKADDR*)&remoteAddr, &nAddrLen);

if (ret > 0)

{

recvData[ret] = 0x00;

printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));

printf(recvData);

}

char * sendData = "一个来自服务端的UDP数据包\n";

sendto(serSocket, sendData, strlen(sendData), 0, (SOCKADDR*)&remoteAddr, nAddrLen);

}

closesocket(serSocket);

WSACleanup();

return 0;

}

CLIENT端

#include

#pragma comment(lib, "ws2_32.lib")

#include

int main(int argc, char* argv[])

{

WORD socketVersion = MAKEWORD(2, 2);

WSADATA wsaData;

if (WSAStartup(socketVersion, &wsaData) != 0)

{

return 0;

}

SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

struct sockaddr_in sin;

sin.sin_family = AF_INET;

sin.sin_port = htons(8000);

sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

int len = sizeof(sin);

char * sendData = "Hello, my friend\n";

sendto(sclient, sendData, strlen(sendData), 0, (SOCKADDR*)&sin, len);

char recvData[255];

int ret = recvfrom(sclient, recvData, 255, 0, (SOCKADDR*)&sin, &len);

if (ret > 0)

{

recvData[ret] = 0x00;

printf(recvData);

}

closesocket(sclient);

WSACleanup();

return 0;

}

编译

gcc server_udp.c -o server_udp -lwsock32

gcc client_udp.c -o client_udp -lwsock32

总结

对于TCP版本的程序来说

server 端:创建WSAStartup -》检测!=0 -》创建socket -》检测SOCKET_ERROR -》声明sockaddr_in结构 -》bind -》检测SOCKET_ERROR -》listen -》检测SOCKET_ERROR -》进入循环 -》accept -》检测SOCKET_ERROR -》接收、发送消息

client 端:创建WSAStartup -》检测!=0 -》创建socket -》检测SOCKET_ERROR -》声明sockaddr_in结构 -》connect -》检测SOCKET_ERROR -》发送、接收消息

对于UDP版本的程序来说

server 端:创建WSAStartup -》检测!=0 -》创建socket -》检测SOCKET_ERROR -》声明sockaddr_in结构 -》bind -》检测SOCKET_ERROR -》进入循环 -》发送、接收消息

client 端:创建WSAStartup -》检测!=0 -》创建socket -》检测SOCKET_ERROR -》声明sockaddr_in结构 -》发送、接收消息

TCP中,使用send和recv函数进行发送和接收消息

UDP中,使用sendto和recvfrom函数进行发送和接收消息

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用VSCode进行C++网络编程时,你需要进行以下配置: 1. 安装VSCode:首先,你需要下载并安装Visual Studio Code编辑器。你可以从官方网站(https://code.visualstudio.com/)下载适用于你的操作系统的安装包,并按照提示进行安装。 2. 安装C++扩展:在VSCode中,你需要安装C++扩展以支持C++编程。打开VSCode,点击左侧的扩展图标(或按下Ctrl+Shift+X),搜索并安装"Microsoft C++"扩展。 3. 安装编译器:你需要安装一个C++编译器来编译和运行你的代码。常用的编译器有GCC和Clang。对于Windows用户,你可以安装MinGW或者MSVC作为编译器。对于Mac用户,Clang已经预装在系统中。对于Linux用户,你可以使用系统自带的GCC编译器。 4. 配置任务:在VSCode中,你可以使用任务来编译和运行你的C++代码。点击菜单栏中的"终端",选择"运行任务",然后选择"配置任务"。在弹出的选项中,选择"C/C++: g++ build active file"(如果你使用GCC编译器)或者"C/C++: clang build active file"(如果你使用Clang编译器)。这将会在.vscode文件夹下生成一个tasks.json文件。 5. 配置调试器:如果你需要进行调试,你可以配置调试器来帮助你。点击菜单栏中的"调试",选择"创建配置文件",然后选择"C++ (GDB/LLDB)"。这将会在.vscode文件夹下生成一个launch.json文件。 6. 编写代码:现在你可以在VSCode中编写C++网络编程的代码了。你可以创建一个新的.cpp文件,并编写你的网络编程代码。 7. 编译和运行:按下Ctrl+Shift+B(或者选择菜单栏中的"终端",然后选择"运行生成任务")来编译你的代码。如果没有错误,你可以在终端中看到生成的可执行文件。然后,你可以在终端中运行这个可执行文件来测试你的网络编程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值