记Windows下初次使用dev C++进行socket编程过程

时间:2022-08-22 23:22:10

记初次接触socket编程,在devC++使用Winsock进行socket编程的一个过程,通过在devC++创建2个项目分别是server、client程序项目,感受通过socket使client与server的一次通讯。

1.新建项目与往常不同,不单单是需要创建一个C文件,更是要在连接库中添加 libws2_32
记Windows下初次使用dev C++进行socket编程过程
记Windows下初次使用dev C++进行socket编程过程
记Windows下初次使用dev C++进行socket编程过程
记Windows下初次使用dev C++进行socket编程过程
在项目管理中的属性配置连接库,然后在项目中新建server.c
记Windows下初次使用dev C++进行socket编程过程
记Windows下初次使用dev C++进行socket编程过程面向连接的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(,),&wsaData)!=)
{
printf("Failed to load Winsock.\n"); //Winsock 初始化错误
return -;
}
sListen = socket(AF_INET,SOCK_STREAM,); //创建服务器端套接字
if(sListen == INVALID_SOCKET)
{
printf("socket() Failed: %d\n",WSAGetLastError());
return -;
}
//以下初始化服务器端地址
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 -;
}
if(listen(sListen,) == SOCKET_ERROR) //进入监听状态
{
printf("lisiten() Failed: %d\n",WSAGetLastError());
return -;
}
iLen = sizeof(cli); //初始化客户端地址长度参数
while() //进入循环等待客户的连接请求
{
sAccept = accept(sListen,(struct sockaddr *)&cli,&iLen);
if(sAccept == INVALID_SOCKET)
{
printf("accept() Failed: %d\n",WSAGetLastError());
return -;
}
printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
//输出客户端 IP 地址和端口号
iSend = send(sAccept,buf,sizeof(buf),); //给客户端发送信息
if(iSend == SOCKET_ERROR) //错误处理
{
printf("send() Failed: %d\n",WSAGetLastError());
break;
}
else if(iSend == )
{
break;
}
else
{
printf("send() byte: %d\n",iSend); //输出发送成功字节数
}
closesocket(sAccept);
}
closesocket(sListen); //关闭 socket
WSACleanup(); //输出发送成功字节数
return ;
}
2.保存最后构建并运行这个项目,编译生成 server.exe。
server项目结构:
记Windows下初次使用dev C++进行socket编程过程
记Windows下初次使用dev C++进行socket编程过程
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 = ;
int iLen; //从服务器端接收的数据长度
char buf[DATA_BUFFER]; //接收缓冲区
struct sockaddr_in ser; //服务器端地址
if(argc<) //判断参数输入是否正确:client [Server IP]
{
printf("Usage: client [server IP address]\n"); //命令行提示
return -;
}
memset(buf,,sizeof(buf)); //初始化接收缓冲区
if(WSAStartup(MAKEWORD(,),&wsaData)!=)
{
printf("Failed to load Winsock.\n"); //Winsock 初始化错误
return -;
}
ser.sin_family = AF_INET; //初始化服务器地址信息
ser.sin_port = htons(iPort); //端口转换为网络字节序
ser.sin_addr.s_addr = inet_addr(argv[]); //IP 地址转换为网络字节序
sClient = socket(AF_INET,SOCK_STREAM,); //创建客户端流式套接字
if(sClient == INVALID_SOCKET)
{
printf("socket() Failed: %d\n",WSAGetLastError());
return -;
}
//请求与服务器端建立 TCP 连接
if(connect(sClient,(struct sockaddr *)&ser,sizeof(ser)) == INVALID_SOCKET)
{
printf("connect() Failed: %d\n",WSAGetLastError());
return -;
}
else
{
iLen = recv(sClient,buf,sizeof(buf),); //从服务器端接收数据
if(iLen == )
return -;
else if(iLen == SOCKET_ERROR)
{
printf("recv() Failed: %d\n",WSAGetLastError());
return -;
}
else
printf("recv() data from server: %s\n",buf); // 输出接收数据
}
closesocket(sClient); //关闭 socket
WSACleanup();
return ;
}
4.运行结果:
启动 server.exe,最后启动 client.ex 程序与服务器通信
记Windows下初次使用dev C++进行socket编程过程
记Windows下初次使用dev C++进行socket编程过程
(客户端每次连接,会收到来自服务端的消息,服务端这边对每次到来的访问将打印访问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;}
-->

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

  1. 在Windows下使用Hexo&plus;GithubPage搭建博客的过程

    1.安装Node.js 下载地址:传送门 去 node.js 官网下载相应版本,进行安装即可. 可以通过node -v的命令来测试NodeJS是否安装成功 2.安装Git 下载地址:传送门 去 Git ...

  2. windows下实现win32俄罗斯方块练手,编程的几点心得

    编程珠玑2阅读笔记: 1.使用c语言性能监视器,完成对代码的调优工作 2.关联数组:  拓扑排序算法,可以用于当存在遮挡的时候决定三维场景的绘制顺序. 3.小型算法中的测试与调试工具 脚手架程序:&l ...

  3. Windows 下安装redis 并且设置开机自动启动的过程&period;

    1. 下载redis 的 windows下的安装文件 https://github.com/MicrosoftArchive/redis/releasesmsi文件下载地址https://github ...

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

    用c/c++编程有些年了,十个指头可以数齐,在涉入iOS objc开发后,有种无比舒服的感觉,尤其在UI开发上. 在QuartzCore.framework下动画和透明窗口等许多效果的事都变得那么方便 ...

  5. windows下用navicat链接虚拟机MySQL数据库的过程和问题解决

    navicat远程连接虚拟机中的MySQL数据库 1.在linux查看mysql服务器IP地址 ifconfig 记住此IP navicat设置 设置完毕 遇到问题 一直连不上,在网上搜索了一下,主要 ...

  6. Linux下面向TCP连接的C&plus;&plus; Socket编程实例

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.即Socket提供了操作上述特殊文件的接口,使用这些接口可以实现网络编程. Socket通信流程图 TCP(Transmis ...

  7. windows下Idea结合maven开发spark和本地调试

    本人的开发环境: 1.虚拟机centos 6.5 2.jdk 1.8 3.spark2.2.0 4.scala 2.11.8 5.maven 3.5.2     在开发和搭环境时必须注意版本兼容的问题 ...

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

    一年前想写一个像cocoa那样,可以方便层动画开发的引擎,写着写着又逆向它的QuartzCore.framework,也就是CoreAnimation的底层,已经大半年没有搞windows这个引擎.大 ...

  9. React-Native android在windows下的踩坑记

    坑很多,跳之前做好准备.没有VPN的同学请浏览完本文后慎行.   你需要先安装最新版本的node.js(我最后使用的是v4.1.2),前往官网下载>> 注:我win7已经安装过Visual ...

随机推荐

  1. 织梦&lpar;dedecms&rpar; 5&period;7 &sol;plus&sol;car&period;php sql注入0day

    测试方法: @Sebug.net   dis本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! <?php $host=$argv[1]; $path=$argv[2]; $ ...

  2. python使用装饰器捕获异常

    可以编写一个通用的捕获异常的装饰器, 当程序发生异常时可以继续执行后续动作. 尤其适合于使用大量断言的验证性程序. 装饰器的实现原理使用了回调技术. 如下所示, robust 是一个装饰器. 当在普通 ...

  3. syslog-ng 安装

    下载 Syslog-NG的rpm包,  地址 http://www.kevindeng.org/wp-content/uploads/2010/10/Syslog-NG.zip unzip解压 [ro ...

  4. 算法导论之python实现插入排序

    插入排序的花费时间 c*n2, c 是常数 伪代码 INSERTION-SORT(A) for i  to A.length key = A[j] //Insert A[j] into the sor ...

  5. Ubuntu 16&period;04安装JDK&sol;JRE并配置环境变量

    作为一个Linux新手,在写这篇文章之前,安装了几次jdk,好多次都是环境变量配置错误,导致无法登录系统.经过几天的研究,今天新装系统,从头来完整配置一遍 系统版本:Ubuntu 16.04 JDK版 ...

  6. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习&lpar;3&rpar;!

    ---恢复内容开始--- 前言- 虽然上文说的是model的绘制但是这个说法并不严谨,之前的几个例子都会有模型文件的读入和载入,可是在LAppRenderer.LAppView中并没有.moc等文件的 ...

  7. matplotlib&amp&semi;numpy画图

    import numpy as np import matplotlib.pyplot as plt x=np.linspace(0,6,100) y=np.cos(2*np.pi*x)*np.exp ...

  8. 小程序问题集:保存失败&colon;Error&colon; ENOENT&colon; no such file or directory&comma; open

    问题如图: 当编译的时候 会提示找不到这个文件(index),但是确信项目目录里已经删除了该页面路径,并且app.json的pages列表中也没有该页面:   这时候需要看一下当前已经打开的文件中是否 ...

  9. A1098&period; Insertion or Heap Sort

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  10. AGC 001E&period;BBQ Hard&lpar;组合 DP&rpar;

    题目链接 \(Description\) 给定长为\(n\)的两个数组\(a,b\),求\[\sum_{i=1}^n\sum_{j=i+1}^n\binom{a_i+a_j+b_i+b_j}{a_i+ ...