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等函数未定义查了一下午资料,经过种种实验才得出这个结论,故作此文以作纪念。码农路漫漫,且行且。。。