windows平台select使用
2015-08-05 22:56
190 查看
服务器端
客户端
#include <iostream> #include <winsock2.h> #include <windows.h> #define InternetAddr "127.0.0.1" #define iPort 6000 #pragma comment(lib, "ws2_32.lib") #pragma pack(push, 1) struct Person { char name[20]; int age; }; #pragma pack(pop) void main() { Person person; memset(&person, 0x00, sizeof(person)); WSADATA wsa; WSAStartup(MAKEWORD(2, 2), &wsa); SOCKET fdServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in server; server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(InternetAddr); server.sin_port = htons(iPort); int ret = bind(fdServer, (sockaddr*)&server, sizeof(server)); ret = listen(fdServer, 4); SOCKET AcceptSocket; fd_set fdread; timeval tv; int nSize; while (1) { FD_ZERO(&fdread);//初始化fd_set FD_SET(fdServer, &fdread);//分配套接字句柄到相应的fd_set tv.tv_sec = 0;//这里我们打算让select等待两秒后返回,避免被锁死,也避免马上返回 tv.tv_usec = 0; select(0, &fdread, NULL, NULL, &tv); static int num = 0; nSize = sizeof(server); if (FD_ISSET(fdServer, &fdread))//如果套接字句柄还在fd_set里,说明客户端已经有connect的请求发过来了,马上可以accept成功 { num++; AcceptSocket = accept(fdServer, (sockaddr*)&server, &nSize); char Buf[] = "back to client"; char sendBuf[100] = { 0 }; sprintf(sendBuf, "[%d] %s", num, Buf); send(AcceptSocket, sendBuf, strlen(sendBuf) + 1, 0); char* buffer = new char(sizeof(Person)); // ret = recv(AcceptSocket,(char*) &person, sizeof(Person), 0); ret = recv(AcceptSocket, buffer, sizeof(Person), 0); memcpy(&person, buffer, sizeof(Person)); person.age = ntohl(person.age); printf("num=%d name:%s, age:%d\n",num, person.name, person.age); // printf("%s\n", buffer); } else//还没有客户端的connect请求,我们可以去做别的事,避免像没有用select方式的阻塞套接字程序被锁死的情况,如果没用select,当程序运行到accept的时候客户端恰好没有connect请求,那么程序就会被锁死,做不了任何事情 { //do something // ::MessageBox(NULL, "waiting", "recv", MB_ICONINFORMATION);//别的事做完后,继续去检查是否有客户端连接请求 //printf("nothing....\n"); //Sleep(2000); } } char buffer[128]; ZeroMemory(buffer, 128); ret = recv(AcceptSocket, buffer, 128, 0);//这里同样可以用select,用法和上面一样 // ::MessageBox(NULL, buffer, "recv", MB_ICONINFORMATION); // printf("%s", buffer); closesocket(AcceptSocket); WSACleanup(); return; }
客户端
#include <Winsock2.h> #include <stdio.h> #pragma comment (lib, "ws2_32.lib") #pragma pack(push, 1) struct Person { char name[20]; int age; }; #pragma pack(pop) void main() { Person person; memset(&person, 0x00, sizeof(Person)); char* sn = "Jame"; memcpy(person.name, sn, strlen(sn)); person.age = 14; WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1, 1); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { return; } if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { WSACleanup(); return; } SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000); connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); char* str = new char(sizeof(Person)); person.age = htonl(person.age); memcpy(str, &person, sizeof(Person)); // send(sockClient,(const char*) &person, sizeof(Person), 0); send(sockClient, str, sizeof(Person), 0); printf("name:%s, age:%d\n", person.name, ntohl(person.age)); char recvBuf[100]; recv(sockClient, recvBuf, 100, 0); printf("%s\n", recvBuf); closesocket(sockClient); WSACleanup(); getchar(); }
相关文章推荐
- CRM项目hellokitty部分交互界面
- poj 1170 Shopping Offers
- java使用socket实现文件传输时的接收判断
- 横竖屏切换时候Activity的生命周期
- IOS基础002自定义控件
- Leetcode: House Robber II
- HTML入门笔记
- Linux下安装NVIDIA显卡驱动(无集显)
- Java线程(4)线程池
- 解决js跨域问题的思路及实践
- iOS开发--画一条黑色的横线
- NYOJ 845 无主之地1
- 5注21选5升序彩票(室友一下午才解决,我只用了1个小时,得瑟一下子)
- CodeForces 115E Linear Kingdom Races(线段树 + DP)
- Java反射 - 简单的给Bean赋值和取值
- yii2关于HTTP请求处理的总结
- POJ C程序设计进阶 编程题#3: 发票统计
- Ant学习-001-ant 基础知识及windows环境配置
- 励精图治---Concurrency---共享对象
- 树莓派实战4:配置一小时发送一次邮件