Windows下C语言的基于TCP的Socket编程
博客说明
文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!
说明
注意在windows平台是需要winsock2.h头文件的,不像在linux平台的socket编程,mac的话是有些问题满意后有时间就来解决一下
必须记载动态链接库:ws2_32.lib
如果你用的是Clion,里面的编译器要选择GCC的,因为VC++6.0是VC98的,所以里面没有,可以去网上下载,也可以用Devc++,这个软件自带有编译器,可以完成这个测试
服务端
#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
//初始化WSA
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0)
{
return 0;
}
//创建套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (slisten == INVALID_SOCKET)
{
printf("创建套接字失败 !");
return 0;
}
//绑定IP和端口
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("绑定端口失败 !");
}
//开始监听
if (listen(slisten, 5) == SOCKET_ERROR)
{
printf("监听失败 !");
return 0;
}
//循环接收数据
SOCKET sClient;
struct sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);
printf("等待连接...\n");
sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
while (1)
{
char revData[255];
if (sClient == INVALID_SOCKET)
{
printf("连接失败 !");
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);
}
//发送数据
const char * sendData = "你好,TCP客户端!\n";
send(sClient, sendData, strlen(sendData), 0);
}
closesocket(sClient); //关闭一个套接口
closesocket(slisten);
WSACleanup(); //WSACleanup()是一个计算机函数,功能是终止Winsock 2 DLL (Ws2_32.dll) 的使用
return 0;
}
客户端
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#include <STDIO.H>
int main(int argc, char* argv[])
{
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(sockVersion, &data) != 0) //Windows异步套接字的启动命令
{
return 0;
}
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建套接字
if (sclient == INVALID_SOCKET)
{
printf("创建失败 !");
return 0;
}
// 套接字结构体
struct sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(8888);
serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (connect(sclient, (struct sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) //连接
{
printf("连接失败!");
closesocket(sclient);
return 0;
}
for (int i = 0; i < 1000; i++)
{
const char * sendData = "我是客户端\n";
send(sclient, sendData, strlen(sendData), 0);
char recData[255];
int ret = recv(sclient, recData, 255, 0);//接受
if (ret > 0)
{
recData[ret] = 0x00;
printf("%d%s",i,recData);
}
}
closesocket(sclient); //关闭套接口
WSACleanup(); //功能是终止Winsock 2 DLL (Ws2_32.dll) 的使用
return 0;
}
测试
先运行服务端,然后再运行客户端
运行客户端
问题解决
如果编译遇到问题,还需要配置一个编译器指令,让它去找:ws2_32.lib
扫描二维码关注公众号,回复:
10195878 查看本文章
选择编译器选项
感谢
万能的网络
以及勤劳的自己