前言

  不得不承认作为一个前端开发,仍有一个后台开发的梦。从socket通信开始学习,在工作之余补充学习点相关知识,记录下学习的过程。

服务端

  服务器代码如下,在设置listen之后,通过accept获取对应的socket连接并创建线程进行通信,通信完成后关闭对应线程。

// socket_service.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib") #define LISTEN_MAX_COUNT 5 DWORD WINAPI AnswerThread(LPVOID lparam)
{
printf("Thread ID:%4d create!\n", GetCurrentThreadId());
int ret;
char buf[] = { };
char sendBuf[] = { };
SOCKET clientSocket = (SOCKET)(LPVOID)lparam;
while (true)
{
memset(buf, , sizeof(buf));
ret = recv(clientSocket, buf, sizeof(buf), );
if (ret<=)
{
break;
}
printf("revc: %s\n", buf);
sprintf_s(sendBuf, "Thread ID:%4d revced", GetCurrentThreadId());
ret = send(clientSocket, sendBuf, strlen(sendBuf) + sizeof(char), );
if (ret <= )
{
break;
}
}
printf("Thread ID:%4d stop!\n", GetCurrentThreadId());
closesocket(clientSocket);
return ;
} int _tmain(int argc, _TCHAR* argv[])
{ WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(, );
if (WSAStartup(wVersionRequested, &wsaData) == INVALID_SOCKET)
{
return ;
} if (LOBYTE(wsaData.wVersion) != ||
HIBYTE(wsaData.wVersion) != ) {
WSACleanup();
return ;
}
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, );
int len = sizeof(SOCKADDR);
SOCKADDR_IN clientAddr;
SOCKADDR_IN serviceAddr;
serviceAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
serviceAddr.sin_family = AF_INET;
serviceAddr.sin_port = htons(); if (bind(sockSrv, (SOCKADDR*)&serviceAddr, len) == INVALID_SOCKET)
{
printf("failed bind!\n");
closesocket(sockSrv);
WSACleanup();
return ;
}
if (listen(sockSrv, LISTEN_MAX_COUNT) == SOCKET_ERROR) {
printf("Listen failed with error: %ld\n", WSAGetLastError());
closesocket(sockSrv);
WSACleanup();
return ;
} SOCKET sockClient;
HANDLE hThread = NULL;
DWORD dwThreadId;
while ()
{
sockClient = accept(sockSrv, (SOCKADDR*)&clientAddr, &len);
Sleep();
hThread = CreateThread(NULL, NULL, AnswerThread, (LPVOID)sockClient, , &dwThreadId);
if (hThread == NULL)
{
printf("CreatThread AnswerThread() failed.\n");
}
} closesocket(sockSrv);
WSACleanup();
return ;
}
客户端

   客户端代码如下,在连接成功后,循环输入进行通信对话。

// socket_client.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <stdio.h>
#include <Winsock2.h> #pragma comment( lib, "ws2_32.lib" ) int _tmain(int argc, _TCHAR* argv[])
{ WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(, );
if (WSAStartup(wVersionRequested, &wsaData) == INVALID_SOCKET)
{
return -;
} if (LOBYTE(wsaData.wVersion) != ||
HIBYTE(wsaData.wVersion) != ) {
WSACleanup();
return -;
} SOCKET sockClient = socket(AF_INET, SOCK_STREAM, );
int len = sizeof(SOCKADDR); SOCKADDR_IN local;
local.sin_addr.S_un.S_addr = inet_addr("192.168.1.15");
local.sin_family = AF_INET;
local.sin_port = htons(); if (connect(sockClient, (SOCKADDR*)&local, len) == INVALID_SOCKET)
{
printf("connect error/n");
return ;
} char inputBuf[];
char recvBuf[];
int ret;
// while (scanf_s("%s", inputBuf, sizeof(inputBuf)) != EOF)
while (gets_s(inputBuf))
{
if (strcmp(inputBuf, "stop") ==)
{
break;
}
ret = send(sockClient, inputBuf, strlen(inputBuf) + sizeof(char), );
if (ret<=)
{
printf("send failed!\n");
break;
}
ret = recv(sockClient, recvBuf, sizeof(recvBuf), );
if (ret <= )
{
printf("recv failed!\n");
break;
}
printf("my reply is : %s\n", recvBuf);
//printf("%s\n", inet_ntoa(local.sin_addr));
} closesocket(sockClient);
WSACleanup();
return ;
}
测试

  Hello World!!

1、开启多个客户端,可以看到服务器如下输出多个线程的创建。

  

2、客户端输入hello world!,可以得到服务器回复,并告知哪个服务器线程接收了消息。

  

3、关闭其中一个客户端,可以看到对应线程也关闭了。

4、关闭服务端后,可以端输入任意内容,可以看到客户端也收到提示发送失败并关闭。

C++的socket编程学习的更多相关文章

  1. socket编程学习step1

    socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768 sockets(套接字)编程有三种,流式套接字(SOCK_ST ...

  2. JAVA Socket 编程学习笔记(二)

    在上一篇中,使用了 java Socket+Tcp/IP  协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...

  3. JAVA Socket 编程学习笔记(一)

    1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的cli ...

  4. Socket编程学习之道:揭开Socket编程的面纱

    对TCP/IP.UDP.Socket编程这些词你不会非常陌生吧?随着网络技术的发展.这些词充斥着我们的耳朵. 那么我想问: 1.         什么是TCP/IP.UDP? 2.         S ...

  5. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  6. 记一次:Windows的Socket编程学习和分析过程

    Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...

  7. Android Socket编程学习笔记

    http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...

  8. BSD socket编程学习

    1.socket简介 BSD是实现TCP/IP协议通信的软件系统,socket是应用编程接口,为app提供使用TCP/IP协议通信的接口. 网络层IP提供点到点服务(IP地址标识),传输层TCP和UD ...

  9. socket编程学习

    socket: 也称作套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求. 常用的套接字API函数: 1.socket(): 函数原型为:int socket(int domain, int ...

随机推荐

  1. 团队作业8——第二次项目冲刺(Beta阶段)--5.24 forth day

    团队作业8--第二次项目冲刺(Beta阶段)--5.24 forth day Day four: 会议照片 项目进展 Beta冲刺的第四天,以下是今天具体任务安排: 队员 昨天已完成的任务 今日计划完 ...

  2. 团队作业4——第一次项目冲刺(Alpha版本)4th day

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 计时功能已经完成,然后24点的代码如何在游戏界面与界面组件联系上正在进行. 四.困难与问题 1.在安卓框架与java代码的结合 ...

  3. 201521123097《Java程序设计》第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 1.本次作业题集集合 public static List return str; } pub ...

  4. 201521123055 《Java程序设计》第4周学习总结

    1. 本章学习总结 2. 书面 Q1.注释的应用使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) Q2.面向对象设计 2.1 将在网上商城购物或者在班级博客进行 ...

  5. 201521123104《Java程序设计》第1周学习总结

    1. 本章学习总结 1.初步了解了什么是Java,以及该如何编写简单的Java程序: 2.认识到相比于C和C++来说,Java更复杂一些,所以学习要花费更大的精力: 3.在编写Java程序过程中,认识 ...

  6. Java课程设计-定时器(团队)

    一.团队介绍(没头脑和不高兴) 陈文俊[组长] 201521123047 网络1512 宣委 郑子熙 201521123045 网络1512 二.项目Git链接 定时器 三.项目git提交记录截图 四 ...

  7. 201521123030 《Java程序设计》 第10周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 在fi ...

  8. 201521123066 《Java程序设计》第十二周实验总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  9. java web SSO单点登录

    第一篇: Web应用系统的演化总是从简单到复杂,从单功能到多功能模块再到多子系统方向发展. .当前的大中型Web互联网应用基本都是多系统组成的应用群,由多个web系统协同为用户提供服务. 多系统应用群 ...

  10. Servlet第四篇【request对象常用方法、应用】

    什么是HttpServletRequest HttpServletRequest**对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,**HTTP请求头中的所有信息都封装在这个对象中,开发人 ...