windows socket 简单实例

Windows下Socket编程主要包括以下几部分:
服务端
   1、初始化Windows Socket库。
   2、创建Socket。
   3、绑定Socket。
   4、监听。
   5、Accept。
   6、接收、发送数据。

客户端
   1、初始化Windows Socket库。
   2、创建Socket。
   3、连接Socket。
   4、接收、发送数据。

服务端每接收到一个客户端的Socket,则创建一个线程。满足一个服务端连接多个客户端。

  1 //Server.cpp
  2 #include <iostream>
  3 #include <winsock2.h>
  4 
  5 using namespace std;
  6 
  7 #pragma comment(lib, "ws2_32.lib")
  8 
  9 #define PORT 4000
 10 #define IP_ADDRESS "10.241.39.19"
 11 
 12 
 13 DWORD WINAPI ClientThread(LPVOID lpParameter)
 14 {
 15     SOCKET CientSocket = (SOCKET)lpParameter;
 16     int Ret = 0;
 17     char RecvBuffer[MAX_PATH];
 18 
 19     while ( true )
 20     {
 21         memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
 22         Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
 23         if ( Ret == 0 || Ret == SOCKET_ERROR ) 
 24         {
 25             cout<<"客户端退出!"<<endl;
 26             break;
 27         }
 28         cout<<"接收到客户信息为:"<<RecvBuffer<<endl;
 29     }
 30 
 31     return 0;
 32 }
 33 
 34 int main(int argc, char* argv[])
 35 {
 36     WSADATA  Ws;
 37     SOCKET ServerSocket, ClientSocket;
 38     struct sockaddr_in LocalAddr, ClientAddr;
 39     int Ret = 0;
 40     int AddrLen = 0;
 41     HANDLE hThread = NULL;
 42 
 43     //Init Windows Socket
 44     if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
 45     {
 46         cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
 47         return -1;
 48     }
 49 
 50     //Create Socket
 51     ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 52     if ( ServerSocket == INVALID_SOCKET )
 53     {
 54         cout<<"Create Socket Failed::"<<GetLastError()<<endl;
 55         return -1;
 56     }
 57 
 58     LocalAddr.sin_family = AF_INET;
 59     LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
 60     LocalAddr.sin_port = htons(PORT);
 61     memset(LocalAddr.sin_zero, 0x00, 8);
 62 
 63     //Bind Socket
 64     Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
 65     if ( Ret != 0 )
 66     {
 67         cout<<"Bind Socket Failed::"<<GetLastError()<<endl;
 68         return -1;
 69     }
 70     //listen
 71     Ret = listen(ServerSocket, 10);
 72     if ( Ret != 0 )
 73     {
 74         cout<<"listen Socket Failed::"<<GetLastError()<<endl;
 75         return -1;
 76     }
 77 
 78     cout<<"服务端已经启动"<<endl;
 79 
 80     while ( true )
 81     {
 82         AddrLen = sizeof(ClientAddr);
 83         ClientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
 84         if ( ClientSocket == INVALID_SOCKET )
 85         {
 86             cout<<"Accept Failed::"<<GetLastError()<<endl;
 87             break;
 88         }
 89 
 90         cout<<"客户端连接::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl;
 91 
 92         hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)ClientSocket, 0, NULL);
 93         if ( hThread == NULL )
 94         {
 95             cout<<"Create Thread Failed!"<<endl;
 96             break;
 97         }
 98 
 99         CloseHandle(hThread);
100     }
101 
102     closesocket(ServerSocket);
103     closesocket(ClientSocket);
104     WSACleanup();
105 
106     return 0;
107 }
 1 // Client.cpp
 2 #include <iostream>
 3 #include <winsock2.h>
 4 
 5 using namespace std;
 6 
 7 #pragma comment(lib, "ws2_32.lib")
 8 
 9 #define PORT 4000
10 #define IP_ADDRESS "10.241.39.19"
11 
12 int main(int argc, char * argv[])
13 {
14     WSADATA Ws;
15     SOCKET ClientSocket;
16     struct sockaddr_in ServerAddr;
17     int Ret = 0;
18     int AddrLen = 0;
19     HANDLE hThread = NULL;
20     char SendBuffer[MAX_PATH];
21 
22     //Init Windows Socket
23     if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
24     {
25         cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
26         return -1;
27     }
28     //Create Socket
29     ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
30     if ( ClientSocket == INVALID_SOCKET )
31     {
32         cout<<"Create Socket Failed::"<<GetLastError()<<endl;
33         return -1;
34     }
35 
36     ServerAddr.sin_family = AF_INET;
37     ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
38     ServerAddr.sin_port = htons(PORT);
39     memset(ServerAddr.sin_zero, 0x00, 8);
40 
41     Ret = connect(ClientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
42     if ( Ret == SOCKET_ERROR )
43     {
44         cout<<"Connect Error::"<<GetLastError()<<endl;
45         return -1;
46     }
47     else
48     {
49         cout<<"连接成功!"<<endl;
50     }
51 
52     while ( true )
53     {
54         cin.getline(SendBuffer, sizeof(SendBuffer));
55         Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
56         if ( Ret == SOCKET_ERROR )
57         {
58             cout<<"Send Info Error::"<<GetLastError()<<endl;
59             break;
60         }
61     }
62 
63     closesocket(ClientSocket);
64     WSACleanup();
65 
66     return 0;
67 }

 

 

转载于:https://www.cnblogs.com/xubin0523/archive/2012/09/11/2679851.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将 image 转成 base64 字符串?

咨询区 vaj90我的项目中有一个需求&#xff0c;需要将 base64 格式的字符串 data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD.. 转成 image 格式&#xff0c;请问我该如何实现&#xff1f;回答区 Patashu&#xff1a;我写了一个 image 和 base64 相互转换的帮助类&#xff…

oracle执行命令显示2,Oracle数据库执行脚本常用命令小结

1. 执行一个SQL脚本文件复制代码 代码如下:sqlplus user/passservicename或复制代码 代码如下:SQL>start file_names或复制代码 代码如下:SQL> file_name我们可以将多条sql语句保存在一个文本文件中&#xff0c;这样当要执行这个文件中的所有的sql语句时&#xff0c;用上…

史上最强的烧脑合集!能全都搞懂的只有天才!

▲ 点击查看牛津大学&#xff0c;全球学生削尖脑袋想进的地方。它真正吸引人的&#xff0c;不仅是雄厚的师资、精湛的学术&#xff0c;更因为立校800余年来&#xff0c;始终有一套经典、独门的“高智商训练”方法&#xff01;25位首相、53位总统、11位国王、47位诺贝尔奖得主&a…

github上面如何编辑README

github上面如何编辑README 今天把自己做好的 《手机摇一摇震动刷新(支持ListView、GridView、Webview)》上传到github,之前代码都上传好了,就差介绍了 第一步:找到READM.md文件进入编辑状态 找到了READM.md文件,修改一番以后,我想试下水,先提交看看,如…

学习使用新浪接口随笔(一)

小生初入C#领域&#xff0c;因为学校部门里面在办新浪微博活动的时候&#xff0c;需要统计转发数量。&#xff08;个别团或者班级会去买转发数量&#xff0c;这没节操的&#xff09;&#xff0c;所以有的时候统计起来的时候&#xff0c;会比较麻烦。于是就产生了想利用新浪的AP…

安装office时,提示某项注册表无法写入,请查看是否有管理员权限

安装office时&#xff0c;提示某项注册表无法写入&#xff0c;请查看是否有管理员权限 大概就是这个意思&#xff0c;记不清楚了&#xff0c;解决办法&#xff1a; 首先如果你确认软件没有问题并且是用管理员帐户登录的话&#xff0c;请关闭防火墙与杀毒软件&#xff0c;重试&a…

开源Winform控件库:花木兰控件库

微信好友推荐&#xff0c;挺好看的Winfrom控件库&#xff0c;下面来看看。花木兰控件库Gitee截图介绍基于 C#&#xff08;语言&#xff09; 4.0 、 VS2019 、 Net Framework 4.0(不包括Net Framework 4.0 Client Profile) 开发的Winform控件库。为了兼容性采用了C#&#xf…

c语言题中的一些陷阱

1、求下列两个数组的长度关系characX[] "abcdefg";char acY[] { a, b,c, d, e, f, g };解析&#xff1a;对于字符串来说&#xff0c;字符串结尾默认为‘\0’&#xff0c;所以acX[]的长度为8&#xff0c;而第二个数组的大小长度为7&#xff0c;而且因为没有用‘\0’结…

“爱因斯坦兄弟”事件轰动纽约时报!双胞胎乱写博士论文,整容后越黑越红,竟然名利双收..........

全世界只有3.14 % 的人关注了爆炸吧知识只要够大就够震撼超模君前几天发了一篇文章《2020年最奇葩论文&#xff0c;打假网站看了都无语&#xff0c;原来外国人更擅长中医》&#xff0c;里面讲到的那篇奇葩论文&#xff0c;可真是让我见识到了什么叫做一本正经胡说八道&#xff…

oracle分区exchange,oracle 分区表exchange原理

oracle分区的exchange操作非常快&#xff0c;那原理是什么呢&#xff1f;下面我们来做个实验&#xff1a;SQL> create table test (id number(3));表已创建。SQL> insert into test values (1);已创建 1 行。SQL> commit;提交完成。SQL> select object_id,data_obj…

Android之手机摇一摇震动刷新(支持ListView、GridView、WebView)并生成我的二维码

手机摇一摇震动刷新 第一步:看摇一摇震动刷新的前后的效果图 1、摇一摇震动刷新前的效果图如下(图片太大了,分2次录屏的,如果看着不爽请猛戳我的github上面的演示) 2、摇一摇震动刷新之后的效果图如下 说明:我笔记本的虚拟机没有重力感应,所以用虚拟机摇一摇没反应…

搭建基于虚拟账号的电子邮件系统

使用postfix&#xff0c;cyrus-sasl&#xff0c;courier-authlib&#xff0c;mysql&#xff0c;dovecot&#xff0c;extmail&#xff0c;extman搭建电子邮件系统&#xff0c;可以使用web方式以虚拟账号注册登录邮箱&#xff0c;并且发送接受邮件&#xff0c;实现电子邮件功能。…

在C#中obsolete表示什么?

这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如&#xff0c;当一个新方法被用在一个类中&#xff0c;但是您仍然想要保持类中的旧方法&#xff0c;您可以通过显示一个应该使用新方法&#xff0c;而不是旧方法的消息&#xff0c;…

php根据分辨率跳转,使用PHP将分辨率转换为Aspect比率

我需要一些可能非常基本的帮助.我正在研究一个接收这些可能的输入字符串的PHP函数(这些是示例,它可以是任何分辨率)&#xff1a;1600x9001440x9001366x7681360x7681280x10241280x8001024x10241024x768640x960320x480320x480etc我想处理这些字符串中的任何一个并返回适当的宽高比…

第一题

转载于:https://www.cnblogs.com/bilibiliganbei/p/5251796.html

Fibonacci Knapsack

http://acm.uestc.edu.cn/problem.php?pid1489&cid164 其实就是用搜索做0/1背包 不要被Fibonacci 唬住了&#xff0c;没什么用。&#xff0c;。。。。。这个比较坑爹 剪枝在代码中说明了 ?View Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2…

此内容过于真实,引起强烈舒适

全世界只有3.14 % 的人关注了爆炸吧知识有这么一群人&#xff0c;年纪轻轻却有着远超同龄人或者常人的思想跟经验。其实&#xff0c;思想深度和年龄的关系并不大。饱读诗书的人&#xff0c;自然见识不凡&#xff0c;思考的内容也比别人更深刻。随着经历和阅历的增加&#xff0c…

远程登录:ftp

ftp服务功能&#xff1a;主要用于文件的传输。端口&#xff1a;21服务&#xff1a;vsftpd软件&#xff1a;vftpd-2.0.1-5i386.rpm配置&#xff1a;/etc/vsftpd/vsftp.conf在配置文件最后加入&#xff1a;chroot_local_useryes表示将用户锁定在自己的主目录更改配置文件之后&…

Win11重磅新功能推送!

微软宣布现已开始向 Windows 11 正式版用户推出全新表情符号&#xff08; emoji &#xff09;&#xff0c;被称为“大眼夹”的经典 Office 助手&#xff08;Clippy&#xff09;现已回归&#xff01;全新表情符号基于流畅设计&#xff08;Fluent Design&#xff09;&#xff0c;…

Android之判断是否有网封装类

Android之判断是否有网封装类 我们做项目的时候,一般都不能离开网络,下面是对判断是否有网类的封装 import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import…