本来打算去虚拟机的server服务器上演示,但是没有设置明白虚拟机和本机的内网IP地址问题,所以就在本机上演示了。
客户机
#pragma comment(lib, "ws2_32.lib") #include <WinSock2.h> #include <stdio.h> #include <stdlib.h> //定义程序中使用的常量 #define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址 #define PORT 5150 //服务端程序端口 #define MSGSIZE 1024 //收发缓冲区的大小 int main() { WSADATA wsaData; //连接所用套节字 SOCKET sClient; //保存远程服务器的地址信息 SOCKADDR_IN server; //收发缓冲区 char szMessage[MSGSIZE]; //成功接收字节的个数 int ret; //加载初始化 WSAStartup(0x0202, &wsaData); //创建客户端套接字 sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //TCP协议 //SOCK_STREAM, IPPROTO_TCP具体指明使用TCP协议 // 指明远程服务器的地址信息(端口号、IP地址等) memset(&server, 0, sizeof(SOCKADDR_IN)); //先将保存地址的server置为全0 server.sin_family = PF_INET; //使用INET协议 server.sin_port = htons(PORT); //端口,本机字节转换成网络字节 server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS); //服务端的IP地址 //结构SOCKADDR_IN的sin_addr字段用于保存IP地址,sin_addr字段也是一个结构体,sin_addr.s_addr用于最终保存IP地址 //inet_addr()用于将 形如的"127.0.0.1"字符串转换为IP地址格式 //连到刚才指明的服务器上 connect(sClient, (struct sockaddr *) &server, sizeof(SOCKADDR_IN)); //连接后可以用sClient来使用这个连接 //server保存了远程服务器的地址信息 while (TRUE) { printf("Send:"); //从键盘输入 gets_s(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage // 发送数据 send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度 } // 释放连接和进行结束工作 closesocket(sClient); WSACleanup(); return 0; }
服务器
#pragma comment(lib, "ws2_32.lib") #include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #define PORT 5150 //端口(一共六万多个) #define MSGSIZE 1024 //接收的数据 int main() { //服务端 //初始化windows套接字网络库 WSADATA wsaData; SOCKET sListen;//服务端套接字 SOCKET sClient;//客户端套接字 SOCKADDR_IN local;//服务端地址 SOCKADDR_IN client;//客户端地址 char szMessage[MSGSIZE]; int ret; int iaddrSize = sizeof(SOCKADDR_IN);//客户端地址的长度 WSAStartup(0x0202, &wsaData);//连接 //创建一个服务端的套接字 sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//TCP协议 //绑定,将套接字和服务端地址做绑定 local.sin_family = AF_INET;//协议,INET协议 local.sin_port = htons(PORT);//端口,本机字节转变成网络字节 local.sin_addr.s_addr = htonl(INADDR_ANY);//地址,本机字节转变成网络字节,任何一个客户端IP都可以连接上来 bind(sListen, (struct sockaddr *) &local, sizeof(SOCKADDR_IN));//做绑定 //开始监听 //最多有1个客户端连接,超了就在队列排队等待 listen(sListen, 1); //接收客户端的连接 sClient = accept(sListen, (struct sockaddr *) &client, &iaddrSize); printf("Accepted client:%s:%d ", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); while(TRUE) { ret = recv(sClient, szMessage, MSGSIZE, 0); szMessage[ret] = '