记Windows下初次使⽤devC++进⾏socket编程过程记初次接触socket编程,在devC++使⽤Winsock进⾏socket编程的⼀个过程,通过在devC++创建2个项⽬分别是server、client程序项⽬,感受通过socket使client与server的⼀次通讯。
1.新建项⽬与往常不同,不单单是需要创建⼀个C⽂件,更是要在连接库中添加 libws2_32
在项⽬管理中的属性配置连接库,然后在项⽬中新建server.c
⾯向连接的C/S程序⼯作流程(TCP)
1. 使⽤WSAStartup()函数检查系统协议栈安装情况
2. 使⽤socket()函数创建服务器端通信套接字
3. 使⽤bind()函数将创建的套接字与服务器地址绑定
4. 使⽤listen()函数使服务器套接字做好接收连接请求准备
5. 使⽤accept()接收来⾃客户端由connect()函数发出的连接请
6. 根据连接请求建⽴连接后,使⽤send()函数发送数据,或者使⽤recv()函数接收数据
7. 使⽤closesocket()函数关闭套接字(可以先⽤shutdown()函数先关闭读写通道)
8. 最后调⽤WSACleanup()函数结束Winsock Sockets API
server代码:
#pragma comment(lib,"ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_PORT 5050 //服务端默认端⼝
int main(int argc, char* argv[])
{
int iPort = DEFAULT_PORT;
WSADATA wsaData;
SOCKET sListen,sAccept;
int iLen; //客户机地址长度
int iSend; //发送数据长度
char buf[] = "I am a server"; //要发送给客户的信息
struct sockaddr_in ser,cli; //服务器和客户的地址
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("Failed to load Winsock.\n"); //Winsock 初始化错误
return -1;
}
sListen = socket(AF_INET,SOCK_STREAM,0); //创建服务器端套接字
if(sListen == INVALID_SOCKET)
{
printf("socket() Failed: %d\n",WSAGetLastError());
return -1;
}
//以下初始化服务器端地址
ser.sin_family = AF_INET; //使⽤ IP 地址族
ser.sin_port = htons(iPort); //主机序端⼝号转换为⽹络字节序端⼝号
ser.sin_addr.s_addr = htonl(INADDR_ANY); //主机序 IP 地址转换为⽹络字节序主机地址
//使⽤系统指定的 IP 地址 INADDR_ANY
if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)) == SOCKET_ERROR) //套接定与地址的绑定{
printf("bind() Failed: %d\n",WSAGetLastError());
return -1;
}
if(listen(sListen,5) == SOCKET_ERROR) //进⼊监听状态
{
printf("lisiten() Failed: %d\n",WSAGetLastError());
return -1;
}
iLen = sizeof(cli); //初始化客户端地址长度参数
while(1) //进⼊循环等待客户的连接请求
{
sAccept = accept(sListen,(struct sockaddr *)&cli,&iLen);
if(sAccept == INVALID_SOCKET)
{
printf("accept() Failed: %d\n",WSAGetLastError());
return -1;
}
printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
//输出客户端 IP 地址和端⼝号
iSend = send(sAccept,buf,sizeof(buf),0); //给客户端发送信息
if(iSend == SOCKET_ERROR) //错误处理
{
printf("send() Failed: %d\n",WSAGetLastError());
break;
}
else if(iSend == 0)
{
break;
}
else
{
printf("send() byte: %d\n",iSend); //输出发送成功字节数
}
closesocket(sAccept);
}
closesocket(sListen); //关闭 socket
WSACleanup(); //输出发送成功字节数
return0;
}
2.保存最后构建并运⾏这个项⽬,编译⽣成 。
server项⽬结构:
3.以同样的⽅法新建 client ⼯程,编译⽣成 。
⾯向连接的C/S程序⼯作流程(TCP)
1. 使⽤WSAStartup()函数检查系统协议栈安装情况
2. 使⽤socket()函数创建客户端套接字
3. 使⽤connect()函数发出也服务器建⽴连接的请求(调⽤前可以不⽤bind()端⼝号,由系统⾃动完成)
4. 连接建⽴后使⽤send()函数发送数据,或使⽤recv()函数接收数据
5. 使⽤closesocet()函数关闭套接字
6. 最后调⽤WSACleanup()函数,结束Winsock Sockets API
client代码:
#pragma comment(lib,"ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DATA_BUFFER 1024 //默认缓冲区⼤⼩
int main(int argc, char * argv[])
{
WSADATA wsaData;
SOCKET sClient;
int iPort = 5050;
int iLen; //从服务器端接收的数据长度
char buf[DATA_BUFFER]; //接收缓冲区
struct sockaddr_in ser; //服务器端地址
if(argc<2) //判断参数输⼊是否正确:client [Server IP]
{
printf("Usage: client [server IP address]\n"); //命令⾏提⽰
return -1;
}
memset(buf,0,sizeof(buf)); //初始化接收缓冲区
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("Failed to load Winsock.\n"); //Winsock 初始化错误
return -1;
}
ser.sin_family = AF_INET; //初始化服务器地址信息
ser.sin_port = htons(iPort); //端⼝转换为⽹络字节序
ser.sin_addr.s_addr = inet_addr(argv[1]); //IP 地址转换为⽹络字节序
sClient = socket(AF_INET,SOCK_STREAM,0); //创建客户端流式套接字
if(sClient == INVALID_SOCKET)
{
printf("socket() Failed: %d\n",WSAGetLastError());
return -1;
}
//请求与服务器端建⽴ TCP 连接
if(connect(sClient,(struct sockaddr *)&ser,sizeof(ser)) == INVALID_SOCKET)
{
printf("connect() Failed: %d\n",WSAGetLastError());
return -1;
}
else
{
iLen = recv(sClient,buf,sizeof(buf),0); //从服务器端接收数据
if(iLen == 0)
return -1;
else if(iLen == SOCKET_ERROR)
{
printf("recv() Failed: %d\n",WSAGetLastError());
return -1;
}
else
printf("recv() data from server: %s\n",buf); // 输出接收数据
}
closesocket(sClient); //关闭 socket
WSACleanup();
return0;socket编程聊天室基本流程
}
4.运⾏结果:
启动 ,最后启动 程序与服务器通信
(客户端每次连接,会收到来⾃服务端的消息,服务端这边对每次到来的访问将打印访问ip和端⼝)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论