客户端,服务端

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | //客户端 #include "mysocket.h" //头文件 using namespace std; int main( int argc, char ** argv) { cout<< "-----------------客户端----------------\n" ; startup(); //检测版本号 if (LOBYTE(wsdata.wVersion)!=2||HIBYTE(wsdata.wHighVersion)!=2){ cout<< "版本号与服务端不匹配!\n" ; WSACleanup(); return FALSE; } //填充服务端信息:这里填和服务端一样 SOCKET client=createSocket(PF_INET,SOCK_STREAM); SOCKADDR_IN server_addr; server_addr.sin_family=AF_INET; string ip; cout<< "请输入IPv4地址:\n" ; cin>>ip; char ipconfig[ip.size()]; for ( int i=0;i<ip.size();i++){ ipconfig[i]=ip[i]; } server_addr.sin_addr.S_un.S_addr=inet_addr(ipconfig); server_addr.sin_port=htons(8226); //发送连接请求 if (connect(client,(SOCKADDR*)&server_addr, sizeof (SOCKADDR)==SOCKET_ERROR)){ cout<< "连接错误!\n" ; WSACleanup(); return -1; } cout<< "成功连接到服务器\n" ; char send_buf[1145],recv_buf[4515]; while (1){ cout<< "输入要发送的信息:\n" ; cin>>send_buf; mysend(client,send_buf); cout<< "等待服务器响应...\n" ; myrecv(client,recv_buf); cout<< "收到来自服务端的信息:\n" ; cout<<recv_buf<<endl; } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | //服务端(以C++作范例) #include"mysocket.h" //导入头文件:由于mysock头文件本身就有其它文件,这里无需导入 using namespace std; SOCKET s_accept; int main() { cout << "---------------------------服务端---------------------------\n" ; cout << "正在启动...\n" ; startup(); cout << "启动成功!\n" ; SOCKET s = createSocket(PF_INET, SOCK_STREAM); //以IPV6协议创建套接字 //填充信息 SOCKADDR_IN server_addr; server_addr.sin_family = AF_INET; //协议 server_addr.sin_port = htons(8226); //端口,随便填 server_addr.sin_addr.S_un.S_addr = inet_addr( "127.0.0.1" ); //ip地址,这里填服务端设备上的ip,127.0.0.1是本地ip,不能实现跨设备交互 if (bind(s, (SOCKADDR*)&server_addr, sizeof (SOCKADDR)) == SOCKET_ERROR) //绑定套接字 { cout << "套接字绑定失败!\n" ; WSACleanup(); return FALSE; } cout << "套接字绑定成功!" << endl; if (listen(s, 1) == SOCKET_ERROR) { //监听:将服务端转为被动状态,接收请求 cout << "监听失败!\n" ; WSACleanup(); return FALSE; } cout << "设置监听状态成功!\n" ; sockaddr_in accept_addr; //用来记录请求连接的套接字信息 int len = sizeof (SOCKADDR); cout << "等待客户端发起请求..." << endl; SOCKET t = accept(s, (SOCKADDR*)&accept_addr, &len); //接受连接请求 if (s_accept == SOCKET_ERROR) { cout << "请求错误!\n" ; WSACleanup(); return FALSE; } cout << "建立连接成功!\n" ; char recv_buf[1145], send_buf[4514]; while (1){ //信息交互部分,可以作改动 myrecv(t, recv_buf); cout << "接收到客户端信息:" << recv_buf << endl; cout << "请输入要发送的信息:" ; cin >> send_buf; mysend(t, send_buf); } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | //mysocket.h #ifndef __MYSOCKET_H__ #define __MYSOCKET_H__ //头文件保护 #include<bits/stdc++.h> #include<winsock.h> #pragma comment(lib,"ws2_32.lib") using namespace std; WSADATA wsdata; void startup(){ //异步启动 if (WSAStartup(MAKEWORD(2, 2), &wsdata)) /* ^ ^ 版本号,这里用的是2.2 | 数据存放处,这里设成全局变量 */ { //返回0则成功,否则失败,报错 cout << "启动失败!\n" ; WSACleanup(); exit (0); } } SOCKET createSocket( int af, int type){ /*原函数原型: SOCKET socket(int af, int type, int protocol) ^ ^ ^ 协议 类型(后文) 形式(一般用0) */ SOCKET ret = socket(af, type, 0); if (ret == INVALID_SOCKET) //错误返回INVALID_SOCKET { //报错 cout << "创建套接字失败!\n" ; WSACleanup(); exit (0); } return ret; } void mysend(SOCKET s, const char * buf){ /* 带报错的send()函数,原函数原型为 : int send(SOCKET s, const char* buf, int len, int flag) 这里为了简化,省略后两个参数。 函数把buf发送给s,返回发送长度 */ int len = send(s, buf, sizeof (buf), 0); if (len < 0) //发送错误 { cout << "信息发送失败!\n" ; WSACleanup(); exit (0); } } void myrecv(SOCKET s, char * buf){ /* 带报错的recv()函数,其原型为: int recv(SOCKET s, char* buf, int len, int flag) 同样省略后两个参数 函数将从s收到的信息储存在buf中,返回接收长度 */ int len = recv(s, buf, sizeof (buf), 0); if (len < 0) { cout << "信息接收失败!\n" ; WSACleanup(); exit (0); } } #endif //别忘了 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步