多线程socket通信server
来源:互联网 发布:淘宝开店快递费用 编辑:程序博客网 时间:2024/05/19 17:59
控制台下实现多线程socket通信,服务端为每个请求的客户端创建一个线程,进行通信。其实这些MSDN里都有。
一.基本流程如下:
定义变量->获得winsock版本->加载winsock库->初始化->创建套接字->设置套接字选项->关闭套接字->卸载winsock库->释放资源
2 建立一个SOCKET
3 绑定SOCKET
4 在指定的端口监听
5 接受一个连接
6 发送和接受数据
7 断开连接
三.注意winsock下编程有用到两个库
Winsock2.h
一.基本流程如下:
定义变量->获得winsock版本->加载winsock库->初始化->创建套接字->设置套接字选项->关闭套接字->卸载winsock库->释放资源
二.客户端 建立过程(上篇是客户端)
服务器
1 初始化WSA2 建立一个SOCKET
3 绑定SOCKET
4 在指定的端口监听
5 接受一个连接
6 发送和接受数据
7 断开连接
三.注意winsock下编程有用到两个库
Winsock2.h
ws2_32.lib
- #include <Winsock2.h>
- #include <stdio.h>
- #include <process.h>
- #pragma comment(lib,"ws2_32.lib")
- unsigned __stdcall ExecuteThread(void* lparam)
- {
- SOCKET ClientSocket=(SOCKET)(void*)lparam;
- char sendText[]="make a connection!\r\n";
- send(ClientSocket, sendText, strlen(sendText)+1, 0 );
- char recvText[100] = {0};
- if (recv(ClientSocket, recvText, 100, 0) != SOCKET_ERROR)
- {
- printf("receive text: %s\n", recvText);
- }
- _endthreadex(0);
- return 0;
- }
- int main(int argc, char* argv[])
- {
- // (1)加载套接字库
- WORD wVersionRequested; //WinSock库的版本号
- WSADATA wsaData;
- int iResult = 0;
- wVersionRequested = MAKEWORD(1, 1);
- iResult = WSAStartup(wVersionRequested, &wsaData);
- if( iResult != NO_ERROR)
- {
- printf("WSAStartup() failed with error: %d\n", iResult);
- return -1 ;
- }
- if( LOBYTE( wsaData.wVersion) != 1 || HIBYTE( wsaData.wVersion) !=1 )
- {
- WSACleanup();
- return -1;
- }
- // (2)创建用于监听的套接字
- SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
- if (sockSrv == INVALID_SOCKET)
- {
- printf("socket function failed with error: %ld\n", WSAGetLastError());
- WSACleanup();
- return -1;
- }
- SOCKADDR_IN addrSrv;
- addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- addrSrv.sin_family = AF_INET;
- addrSrv.sin_port = htons(51555);
- // (3)绑定套接字
- iResult = bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
- if (iResult == SOCKET_ERROR)
- {
- printf("bind function failed with error %d\n", WSAGetLastError());
- iResult = closesocket(sockSrv);
- if (iResult == SOCKET_ERROR)
- {
- printf("closesocket function failed with error %d\n", WSAGetLastError());
- }
- WSACleanup();
- return -1;
- }
- // (4)将套接字设为监听模式,准备接受客户请求
- iResult = listen(sockSrv, SOMAXCONN);
- if (iResult == SOCKET_ERROR)
- {
- printf("listen function failed with error: %d\n", WSAGetLastError());
- }
- printf("Listening on socket...\n");
- // (5)创建线程等待客户请求
- SOCKADDR_IN addrClient;
- int len = sizeof(SOCKADDR);
- SOCKET sockConn;
- unsigned dwThreadId;
- HANDLE hThread;
- while(1)
- {
- //等待客户请求
- sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
- if (sockConn == INVALID_SOCKET )
- {
- printf("accept function failed with error: %d\n", WSAGetLastError());
- }
- // _beginthreadx比createthread更安全
- hThread = (HANDLE)_beginthreadex(NULL, 0, &ExecuteThread, (void*)sockConn, 0, &dwThreadId );
- WaitForSingleObject(hThread, INFINITE );
- }
- // (6)结束处理
- CloseHandle(hThread);
- iResult = closesocket(sockConn);
- if (iResult == SOCKET_ERROR)
- {
- printf("closesocket function failed with error %d\n", WSAGetLastError());
- WSACleanup();
- return -1;
- }
- WSACleanup();
- return 0;
- }
0 0
- 多线程socket通信server
- 多线程socket通信server
- Java Socket编程 多线程server和client通信demo
- 多线程异步Socket通信
- 多线程socket通信client
- Socket 多线程通信
- 多线程Socket通信
- Socket通信-accept+多线程
- Java Socket通信(多线程)
- Java Socket多线程通信例子
- java模拟多线程socket通信
- socket多线程服务器网络通信
- socket通信之http-server
- socket通信之http-server
- socket通信实例server端
- 进程间通信 SOCKET Server
- socket通信之http-server
- 服务器端的多线程SOCKET Server
- 无规则排序
- 黑马程序员 —— 反射
- linux权限详解 .
- 单例GCD创建与图片生成缩略图
- MDK 查看局部变量显示<not in scope>
- 多线程socket通信server
- Java和c#开发语言的不同点
- 一个经典例子让你彻彻底底理解java回调机制
- IOS文件处理
- oracle 子查询因子化 浅谈(with的使用)
- HTML中的Hack手段之条件注释
- 2014过了,2015来了
- SOAP详解
- Ernest Adams总结50个最伟大的游戏创意