Windows下的网络编程(tcp循环并发服务器) 阳光穿透心脏的1/2处 2022-07-12 04:59 127阅读 0赞 学了Windows下的网路编程,做了一个小例子试了下手,和Linux下的网路编程感觉总体上差不多,但是细节上,比如说函数的实现还是有些不同。总的结构和Linux差不多,如下图所示: ![20170211203912820][] 话不多说,直接上代码,和Linux网络编程一样,我也把socket、bind、listen、accept、connect函数封装在了一个文件中,服务器和客户端是公用的。 /***********socket.h********************/ #ifndef SOCKET_H #define SOCKET_H #pragma comment(lib, "ws2_32.lib") #include <iostream> #include <string> #include <Windows.h> #define SERV_PORT 9000 using namespace std; extern void tcp_WSA(); extern int tcp_init(); extern int tcp_accept(int sfd); extern int tcp_connet(); #endif /***********socket.c********************/ #include "socket.h" void tcp_WSA() { WSADATA lpWSAD; WORD wVer = MAKEWORD(2,2); int ret; ret = WSAStartup(wVer, &lpWSAD); if (ret != 0) { cout<<"初始化错误"<<endl; return; //初始化错误 } if ( LOBYTE( lpWSAD.wVersion ) != 2 || HIBYTE( lpWSAD.wVersion ) != 2 ) { cout<<WSACleanup( )<<endl; return; } } int tcp_init() { SOCKET sfd; sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sfd == INVALID_SOCKET) { cout<<"socket create fail"<<endl; return -1; } int ret; struct sockaddr_in FAR serveraddr; memset(&serveraddr,0,sizeof(struct sockaddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(SERV_PORT); serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); ret = bind(sfd, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr)); if (ret == SOCKET_ERROR) { cout<<"bind fail"<<endl; return -1; } ret = listen(sfd, 10); if (ret == SOCKET_ERROR) { cout<<"listen fail"<<endl; return -1; } return sfd; } int tcp_accept(int sfd) { SOCKET cfd; struct sockaddr_in FAR addr; int FAR addrlen = sizeof(struct sockaddr); cfd = accept(sfd, (struct sockaddr *)&addr, &addrlen); if (cfd == INVALID_SOCKET) { cout<<"accept fail"<<endl; return -1; } cout<<inet_ntoa(addr.sin_addr)<<" "<<ntohs(addr.sin_port)<<" success connect..."<<endl; return cfd; } int tcp_connet() { int ret; SOCKET sfd; sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sfd == INVALID_SOCKET) { cout<<"socket create fail"<<endl; return -1; } struct sockaddr_in FAR serveraddr; memset(&serveraddr, 0,sizeof(struct sockaddr_in)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(SERV_PORT); serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ret = connect(sfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr)); //将sfd连接至指定的服务器网络地址 serveraddr if (ret == SOCKET_ERROR) { cout<<"connect fail"<<endl; return -1; } return sfd; } /***********client.c********************/ #include "socket.h" int main() { tcp_WSA(); int sfd, ret; char ch; sfd = tcp_connet(); while(1) { cout<<"请输入一个小写字母:"; cin>>ch; ret = send(sfd, &ch, sizeof(ch), 0); if (ret == -1) { cerr<<"send error,please send again"<<endl; continue; } ret = recv(sfd, &ch, sizeof(ch), 0); if(ret == -1) { cerr<<"recv error"<<endl; continue; } cout<<"转换后的字母为:"<<ch<<endl; } shutdown(sfd, 2); closesocket(sfd); WSACleanup(); } /**************server.c******************/ #include "socket.h" DWORD WINAPI func(LPVOID p) { int cfd = (int)p; int ret; char ch; while(1) { ret = recv(cfd, &ch, sizeof(ch), 0); if(ret == -1) { cerr<<"xxx下线"<<endl; break; } ch = ch - ('a' - 'A'); ret = send(cfd, &ch, sizeof(ch), 0); if(ret == -1) { cerr<<"send error"<<endl; continue; } } return 0; } int main() { int ret; SOCKET sfd, cfd; tcp_WSA(); sfd = tcp_init(); while (1) { cfd = tcp_accept(sfd); DWORD thread1Id; HANDLE handel1 = CreateThread(NULL, 0, func, (LPVOID) cfd, 0, &thread1Id); if (handel1 == false) { cerr<<"create error"<<endl; return -1; } WaitForSingleObject(handel1, 0); CloseHandle(handel1); } shutdown(cfd, 2); closesocket(cfd); WSACleanup(); } [20170211203912820]: /images/20220711/9d064e40daa9460096422120c7c50993.png
相关 Java网络编程:服务器端的TCP连接问题 在Java中进行网络编程,特别是在处理服务器端的TCP连接时,可能会遇到以下几种问题: 1. **创建Socket对象**: - 错误:`Socket s = new 淡淡的烟草味﹌/ 2024年09月10日 23:18/ 0 赞/ 22 阅读
相关 linux下tcp并发服务器,Linux网络编程——tcp并发服务器(epoll实现) \include \include \include \include \include \include \include \include \include 比眉伴天荒/ 2023年01月19日 08:20/ 0 赞/ 99 阅读
相关 Unix/Linux编程:循环的、面向连接(TCP)服务器------DAYTIME 分配被动的TCP服务器 include <sys/types.h> include <sys/socket.h> include <ne àì夳堔傛蜴生んèń/ 2022年10月05日 13:51/ 0 赞/ 114 阅读
相关 Windows下的网络编程(tcp循环并发服务器) 学了Windows下的网路编程,做了一个小例子试了下手,和Linux下的网路编程感觉总体上差不多,但是细节上,比如说函数的实现还是有些不同。总的结构和Linux差不多,如下 阳光穿透心脏的1/2处/ 2022年07月12日 04:59/ 0 赞/ 128 阅读
相关 Linux下各类TCP网络服务器的实现源代码 [http://www.chinaunix.net/jh/4/786283.html][http_www.chinaunix.net_jh_4_786283.html] [ 旧城等待,/ 2022年06月10日 05:28/ 0 赞/ 54 阅读
相关 网络编程--TCP TCP--传输控制协议 udp通信模型在通信的开始之前不需要建立相关的连接,只需要发送数据即可,类似于日常生活中的写信。 tcp协议是一种面向连接的、可靠的、基于字节流 迈不过友情╰/ 2022年03月22日 04:40/ 0 赞/ 238 阅读
相关 网络编程:TCP实现客户端并发登录 【需求】:TCP实现客户端并发登录 > 1.客户端通过键盘录入用户名 > 2.服务端对用户名进行校验:如果该用户存在,服务端显示“XXX,已登录”,并在客户端显示“XXX 刺骨的言语ヽ痛彻心扉/ 2021年10月01日 01:50/ 0 赞/ 343 阅读
相关 TCP网络编程 TCP网络编程 TCP协议 TCP协议,传输控制协议(Transmission Control Protocol,缩写为TCP) 是一种面向连接的、可靠的、安全的 冷不防/ 2021年09月17日 09:42/ 0 赞/ 382 阅读
还没有评论,来说两句吧...