1.基本流程:
服务端: 创建socket->bind()地址和端口->listen()设置为监听模式->accept()接受客户端请求,收到了就返回新socket,这个
socket包含了客户端的信息->recv()接受数据,send()发送数据->shutdown()通知对方不再发送或接受数据.然后closesocket()关闭客户端套接字
->继续监听或者closesocket()关闭本地socket.
客户端:socket()创建本地socket,connect()将本地socket连接到服务器->send()发送,recv()接受数据->完了后shutdown()通知对方不再继续通信,
closesocket()关闭socket.
简单实例:
服务端:
#include <WinSock2.h> #include<stdio.h> #include<windows.h> #include<string.h> #pragma comment(lib,"ws2_32.lib") void main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { printf("版本错误\n"); return; } int status; int len=sizeof(SOCKADDR); char recvBuffer[1024]; char sendBuffer[1024]; SOCKET server_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); SOCKET client_socket; SOCKADDR_IN bind_addr; SOCKADDR_IN client_addr; bind_addr.sin_family = AF_INET; bind_addr.sin_port = htons(8888); bind_addr.sin_addr.S_un.S_addr = htonl(ADDR_ANY); status = bind(server_socket, (const sockaddr*)&bind_addr, sizeof(sockaddr)); if (status==SOCKET_ERROR) { printf("bind error code is %d\n", WSAGetLastError()); WSACleanup(); return; } status = listen(server_socket, 1); if (status== SOCKET_ERROR) { printf("listen error code is %d\n", WSAGetLastError()); WSACleanup(); return; } client_socket = accept(server_socket, (sockaddr*)&client_addr, &len); if (client_socket == INVALID_SOCKET) { printf("accept error code is %d\n", WSAGetLastError()); closesocket(server_socket); WSACleanup(); return; } printf("info: connected by %s %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); printf("info: type quit to quit\n"); while (1) { memset(recvBuffer, 0, sizeof(recvBuffer)); memset(sendBuffer, 0, sizeof(sendBuffer)); recv(client_socket, recvBuffer, sizeof(recvBuffer), 0); if (strcmp(recvBuffer, "quit")==0) { printf("客户端关闭连接,服务端将关闭\n"); closesocket(server_socket); closesocket(client_socket); WSACleanup(); return; } printf("收到:%s\n", recvBuffer); printf("输入要发送的内容\n"); scanf("%s", sendBuffer); if (strcmp(sendBuffer, "quit") == 0) { printf("退出!\n"); send(server_socket, "quit", 5, 0); closesocket(server_socket); closesocket(client_socket); WSACleanup(); return; } send(client_socket, sendBuffer, sizeof(sendBuffer), 0); } }
客户端:
#include <WinSock2.h> #include<stdio.h> #include<windows.h> #include<string.h> #pragma comment(lib,"ws2_32.lib") void main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { printf("版本错误\n"); return; } int len = 0; int status; char recvBuffer[1024]; char sendBuffer[1024]; SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SOCKADDR_IN addr; addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addr.sin_port = htons(8888); addr.sin_family = AF_INET; status = connect(server_socket, (sockaddr*)&addr, sizeof(sockaddr)); if (status==SOCKET_ERROR) { printf("连接失败,错误码:%d\n", WSAGetLastError()); closesocket(server_socket); WSACleanup(); } printf("info: 连接成功\n"); printf("发送quit退出\n"); while (1) { memset(recvBuffer, 0, sizeof(recvBuffer)); memset(sendBuffer, 0, sizeof(sendBuffer)); printf("输入发送的消息\n"); scanf("%s", sendBuffer); if (strcmp(sendBuffer, "quit")==0) { printf("退出!\n"); send(server_socket, "quit", 5, 0); closesocket(server_socket); WSACleanup(); return; } send(server_socket, sendBuffer, sizeof(sendBuffer), 0); recv(server_socket, recvBuffer, sizeof(recvBuffer), 0); if (strcmp(recvBuffer, "quit") == 0) { printf("服务端关闭连接,客户端将关闭\n"); closesocket(server_socket); WSACleanup(); return; } printf("接收到: %s\n", recvBuffer); } }