devc编译器中的socket编程爬坑日记

devc 专栏收录该内容
1 篇文章 0 订阅

Devc下socket编程注意事项

1.需要在【工具T】->【编译选项C】->【编译器】中勾选编译时加入以下命令,然后在输入框中输入-lwsock32,确定后关闭该窗口,(否则运行程序时会出现很多函数未定义的编译错误),步骤如下截图所示:
在这里插入图片描述
在这里插入图片描述
2.不需要在代码中添加#pragma comment(lib,“ws2_32.lib”)语句也能正常运行源文件!

我的简单socket学习demo

server.c

#include<stdio.h>
#include<winsock.h>
int main()
{
	//=======================定义变量=======================//
	char sendBuffer[100];									//发送数据的缓冲区
	char receiveBuffer[100];								//接收数据的缓冲区
	int sendLength;											//发送数据的长度
	int receiveLength;										//接收数据的长度
	int length;												//表示SOCKADDR的大小
	 
	SOCKET socketServer;									//服务器套接字
	SOCKET socketClient;									//客户端的连接套接字
	
	SOCKADDR_IN serverAddress;								//服务器地址
	SOCKADDR_IN	clientAddress;								//客户端地址
	
	WORD wVersonRequested;									//字(word):unsigned short
	WSADATA wsaData;										//库版本信息结构
	int error;												//表示错误
	
	//====================初始化套接字库====================//
	wVersonRequested=MAKEWORD(2,2);							//定义版本类型,将两个字节组合成一个字,前面是低字节,后面是高字节
	error=WSAStartup(wVersonRequested,&wsaData);			//加载套接字库,初始化ws2_32.dll动态链接库 
	if(error!=0)
	{
		printf("加载套接字库失败!\n");
		return 0;											//程序结束 
	}
	if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
	{
		WSACleanup();										//不符合 
		return 0;											//程序结束 
	}
	
	//=====================设置连接地址=====================//
	serverAddress.sin_family=AF_INET;						//地址家族,对于必须是AF_INET,注意只有它不是网络字节顺序
	serverAddress.sin_addr.S_un.S_addr=htonl(INADDR_ANY);	//主机地址
	serverAddress.sin_port=htons(5050);						//端口号
	
	//===================创建服务器套接字===================// 
	socketServer=socket(AF_INET,SOCK_STREAM,0);				//AF_INET表示地址族,SOCK_STREAM表示流式套接字TCP,特定的地址家族相关的协议
	
	//===========绑定套接字到本地某个地址和端口上===========// 
	/*socketServer为套接字,(SOCKADDR*)&serverAddress为服务器地址*/ 
	if(bind(socketServer,(SOCKADDR*)&serverAddress,sizeof(SOCKADDR))==SOCKET_ERROR)
	{
		printf("绑定失败!\n");
	}
	else
	{
		printf("绑定成功地址端口!\n");	
	} 
	
	//=================设置套接字为监听状态=================// 
	if(listen(socketServer,10)<0)							//监听状态,为连接做准备,最大等待的数目为10 
	{
		printf("监听失败!\n"); 
	}
	else
	{
		printf("正在监听...\n");	
	} 
	
	//=======================接收连接=======================//
	length=sizeof(SOCKADDR);
	/*接收客户端的发送请求,等待客户端的连接请求*/
	socketClient=accept(socketServer,(SOCKADDR*)&clientAddress,&length);
	if(socketClient==SOCKET_ERROR)
	{
		printf("接收连接失败!\n");
	}
		
	//=======================进行聊天=======================//
	while(1)												//无限循环 
	{	
		/*接收数据*/
		receiveLength=recv(socketClient,receiveBuffer,100,0);
		if(receiveLength<0)
		{
			printf("接收失败!\n");
			printf("程序退出!\n");
			break;
		}
		else
		{
			printf("客户端 : %s\n",receiveBuffer);			//显示客户端发送的数据 
		}
		
		/*发送数据*/
		printf("请输入消息:");
		gets(sendBuffer);
//		scanf("%s",sendBuffer);
		sendLength=send(socketClient,sendBuffer,100,0);	
		if(sendLength<0)
		{
			printf("发送失败!\n");
		}
		else
		{
			printf("发送成功!\n");	
		}
	}
	
	//==============释放套接字,关闭动态库==============//
	closesocket(socketClient);							//关闭客户端的套接字资源 
	closesocket(socketServer);							//关闭服务器的套接字资源 
	WSACleanup();										//关闭动态链接库 
	return 0;
}

client.c

#include<stdio.h>
#include<winsock.h>

int main()
{
	//=======================定义变量=======================//
	char sendBuffer[100];									//发送数据的缓冲区
	char receiveBuffer[100];								//接收数据的缓冲区
	int sendLength;											//发送数据的长度
	int receiveLength;										//接收数据的长度
	
	SOCKET socketClient;									//客户端的连接套接字
	SOCKADDR_IN serverAddress;								//服务器地址信息结构
	
	WORD wVersonRequested;									//字(word):unsigned short
	WSADATA wsaData;										//库版本信息结构
	int error;												//表示错误
	
	//====================初始化套接字库====================//
	wVersonRequested=MAKEWORD(2,2);							//定义版本类型,将两个字节组合成一个字,前面是低字节,后面是高字节
	error=WSAStartup(wVersonRequested,&wsaData);			//加载套接字库,初始化ws2_32.dll动态链接库 
	if(error!=0)
	{
		printf("加载套接字库失败!\n");
		return 0;											//程序结束 
	}
	if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
	{
		WSACleanup();										//不符合 
		return 0;											//程序结束 
	}
	
	//=====================设置连接地址=====================//
	serverAddress.sin_family=AF_INET;						//地址家族,对于必须是AF_INET,注意只有它不是网络字节顺序
	serverAddress.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");	//主机地址
	serverAddress.sin_port=htons(5050);						//端口号 
	
	//=====================连接到服务器=====================//
	socketClient=socket(AF_INET,SOCK_STREAM,0);				//客户端创建套接字,但是不需要绑定,只需要和服务端建立连接就可以了
	/*进行连接服务器*/
	if(connect(socketClient,(SOCKADDR*)&serverAddress,sizeof(SOCKADDR))==SOCKET_ERROR)
	{
		printf("连接失败!\n");	
		return -1;
	} 
	else
	{
		printf("连接成功!\n");
	}
	
	//=======================进行聊天=======================//
	while(1)
	{
		/*发送数据*/
		printf("输入要发送的数据:");
		gets(sendBuffer);
//		scanf("%s",sendBuffer);
		sendLength=send(socketClient,sendBuffer,100,0);		//发送数据
		if(sendLength<0)
		{
			printf("发送失败!\n");	
		} 
		else
		{
			printf("发送成功!\n");	
		}
		
		/*接收数据*/
		receiveLength=recv(socketClient,receiveBuffer,100,0);
		if(receiveLength<0)
		{
			printf("接收失败!\n");
			printf("程序结束!\n");
			break;
		}
		else
		{
			printf("服务端:%s\n",receiveBuffer);
		}
	}
	
	//==============释放套接字,关闭动态库==============//
	closesocket(socketClient);							//关闭客户端的套接字资源 
	WSACleanup();										//关闭动态链接库 
	return 0;
}

demo运行结果

首先运行server.c
在这里插入图片描述
接下来运行client.c
在这里插入图片描述
客户端向服务器发送一句问候
在这里插入图片描述
此时服务端接收消息
在这里插入图片描述
服务器发送一句消息给客户端
在这里插入图片描述
客户端接收结果
在这里插入图片描述

爬坑日记

别看描述这么简单,博主可是因为WSAStartup等函数未定义查了一下午资料,经过种种实验才得出这个结论,故作此文以作纪念。码农路漫漫,且行且。。。

  • 10
    点赞
  • 7
    评论
  • 21
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值