记Windows下初次使用dev C++进行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(); //输出发送成功字节数
return 0;
}

2.保存最后构建并运行这个项目,编译生成 server.exe。

server项目结构:

3.以同样的方法新建 client 工程,编译生成 client.exe。

面向连接的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();
return 0;
}

4.运行结果:

启动 server.exe,最后启动 client.ex 程序与服务器通信

(客户端每次连接,会收到来自服务端的消息,服务端这边对每次到来的访问将打印访问ip和端口)

li {list-style-type:decimal;}.wiz-editor-body ol.wiz-list-level2 > li {list-style-type:lower-latin;}.wiz-editor-body ol.wiz-list-level3 > li {list-style-type:lower-roman;}.wiz-editor-body blockquote {padding: 0 12px;}.wiz-editor-body blockquote > :first-child {margin-top:0;}.wiz-editor-body blockquote > :last-child {margin-bottom:0;}.wiz-editor-body img {border:0;max-width:100%;height:auto !important;margin:2px 0;}.wiz-editor-body table {border-collapse:collapse;border:1px solid #bbbbbb;}.wiz-editor-body td,.wiz-editor-body th {padding:4px 8px;border-collapse:collapse;border:1px solid #bbbbbb;min-height:28px;word-break:break-word;box-sizing: border-box;}.wiz-hide {display:none !important;}
-->

原文地址:https://www.cnblogs.com/liqiujiong/p/9607453.html

时间: 2024-10-10 17:43:07

记Windows下初次使用dev C++进行socket编程过程的相关文章

[分词]NLPIR/ICTCLAS2014分词系统的C++ API 在Windows下初次使用

软件包准备 NLPIR/ICTCLAS2014分词系统下载包 Dev-C++ 操作系统Windows 解压分词系统下载包后看到 在这里Windows下所需要的是Data.include中的NLPIR.h.lib中win32的NLPIR.libNLPIR.dll,文件使用方法待会儿再说. 在 Dev C++中新建项目 将上述的Data.NLPIR.h.NLPIR.lib.NLPIR.dll拷贝到项目NLPIR工作目录下,如图 右键NLPIR->项目属性 在“参数”界面,点击“加入库或者对象”,将N

在Windows下使用Hexo+GithubPage搭建博客的过程

1.安装Node.js 下载地址:传送门 去 node.js 官网下载相应版本,进行安装即可. 可以通过node -v的命令来测试NodeJS是否安装成功 2.安装Git 下载地址:传送门 去 Git 官网下载相应版本,进行安装即可. 选择在第二个在系统的cmd也可以使用 可以通过git –version的命令来测试git是否安装成功 3.注册Github账号 去 Github 官网进行注册即可. 注册完之后记得添加 SSH Key. 这个 SSH Key是一个认证,让github识别绑定这台机

记windows下安装scrapy的艰辛

昨天想装一个scrapy来玩玩,然后我找了文档看,一个一个安装依赖 Python√ setuptools√ 以下都是用easy_install进行安装的 Zope.Interface√ Twisted 出现问题,下载不了,于是我到官网找了个包下载安装 w3lib√ libxml2找不到 lxml代替之√ pyOpenSSL√ scrapy√ 到这里我以为就装好了,真是太天真了,其实还有一个依赖的cryptography没有安装 好吧然后我easy_install cryptography,提示错

Windows下初次手动安装composer详细教学

1.下载compser.phar 地址 https://getcomposer.org/download/ 2.新建composer.bat 文件,写入"@php "%~dp0composer.phar" %*" 3.把composer.bat   composer.phar 两个文件放入 4.向环境变量里面写人";D:\phpStudy\php\php-5.4.45;D:\phpStudy\php\php-5.4.45\ext"       

记windows下Python删除不干净,导致程序卸载面板卸载不了问题

问题出现原因:删除Python没有正常删除,而是直接删除了安装Python的文件夹,导致卸载面板还存在对应版本,但是卸载会出错(卸载不掉).解决:找到路径:C:\Users\[用户名]AppData\Local\Package Cache\ :路径下文件如下,删除对应卸载不掉的文件目录,不带版本信息的目录删除即可,然后再卸载面板双击卸载就可以彻底删除对应版本** 原文地址:https://blog.51cto.com/10412806/2472964

构思一个在windows下仿objc基于动画层ui编程的ui引擎

用c/c++编程有些年了,十个指头可以数齐,在涉入iOS objc开发后,有种无比舒服的感觉,尤其在UI开发上. 在QuartzCore.framework下动画和透明窗口等许多效果的事都变得那么方便和自然.因为在windows窗口机制中没有动画和透明窗口(Aero 除外)等效果的引擎层,还有GDI中不支持ARGB,开发中都要依靠不断重复而且大量的BitBlt和Timer来完成,工作量与开发iOS不可比. 大体上就是尝试引入UIKit.framework那样的编程体验.首先要有QuartzCor

redis在windows下启动# Creating Server TCP listening socket 127.0.0.1:6379: bind: No error解决

按顺序输入: 1.redis-cli.exe 2.shutdown 3.exit 4.redis-server.exe redis.window.conf

Linux下的基于Pthread的多线程Socket编程

程序设计 服务端的程序的设计主要是一个主线程首先调用Socket相关的函数socket,bind, listen在建立服务端的Socket之后,等待Accept上面,如果有新的客户端连接上来,则对于每一个客户端新建一个线程.在每一个客户端的线程中,其接收客户端发送的指令然后返回相关的信息,主线程Socket中默认的Accpet默认是阻塞的,这里采用了Linux中函数fctnl将其设置成非阻塞.除了客户端对应的线程和主线程之外,服务端还存在一个服务端的控制线程,其主要是接受服务端的命令,诸如退出,

windows下自制动画层引擎 - 放两个demo

一年前想写一个像cocoa那样,可以方便层动画开发的引擎,写着写着又逆向它的QuartzCore.framework,也就是CoreAnimation的底层,已经大半年没有搞windows这个引擎.大体来看,动画简单来说有9要素,矩形区域(x, y, w, h),仿射变换矩阵(translation, rotation, scale),还有就是透明度alpha,除此还必须有线性变化函数.这些在cocoa中构成了最基本的动画,也最常用,通常提交动画一个始态,一个终态,以及时间就OK了.有次序的动画