TCP服务端通信的常规步骤:
- 使用 socket() 创建 TCP 套接字(socket)
- 将创建的套接字绑定到一个本地地址和端口上(Bind)
- 将套接字设为监听模式,准备接收客户端请求(listen)
- 等待客户请求到来: 当请求到来后,接受连接请求,返回一个对应于此次连接的新的套接字(accept)
- 用 accept 返回的套接字和客户端进行通信(使用 write() / send() 或 send() / recv() )返回,等待另一个客户请求关闭套接字
TCP客户端通信的常规步骤:
- 创建套接字(socket)
- 使用 connect() 建立到达服务器的连接(connect)
- 客户端进行通信(使用 write() / send() 或 send() / recv() )
- 使用 close() 关闭客户连接
一。 TCP
server端:
C++ Code
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 | | #include "stdafx.h"#include #include #pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]) {//初始化WSA WORD sockVersion = MAKEWORD(2,2); WSADATA wsaData;if(WSAStartup(sockVersion, &wsaData)!=0) {return 0; }//创建套接字 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(slisten == INVALID_SOCKET) { printf("socket error !");return 0; }//绑定IP和端口 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(8888); sin.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("bind error !"); }//开始监听 if(listen(slisten, 5) == SOCKET_ERROR) { printf("listen error !");return 0; }//循环接收数据 SOCKET sClient; sockaddr_in remoteAddr;int nAddrlen = sizeof(remoteAddr);char revData[255]; while (true) { printf("等待连接...\n"); sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);if(sClient == INVALID_SOCKET) { printf("accept error !");continue; } printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));//接收数据 int ret = recv(sClient, revData, 255, 0); if(ret > 0) { revData[ret] = 0x00; printf(revData); }//发送数据 char * sendData = "你好,TCP客户端!\n"; send(sClient, sendData, strlen(sendData), 0); closesocket(sClient); } closesocket(slisten); WSACleanup();return 0; } |
client端:
C++ Code
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 | | #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <windows.h>#pragma comment(lib,"ws2_32.lib")int main(int argc, char *argv[]) { WORD sockVersion = MAKEWORD(2, 2); WSADATA data;if(WSAStartup(sockVersion, &data) != 0) {return 0; } SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sclient == INVALID_SOCKET) { printf("invalid socket !");return 0; } sockaddr_in serAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(8888); serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) { printf("connect error !"); closesocket(sclient);return 0; }char *sendData = "你好,TCP服务端,我是客户端!\n"; send(sclient, sendData, strlen(sendData), 0);char recData[255];int ret = recv(sclient, recData, 255, 0);if(ret > 0) { recData[ret] = 0x00; printf(recData); } closesocket(sclient); WSACleanup();return 0; } |
二.UDP
SERVER 端
C++ Code
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 | | #include "stdafx.h"#include #include #pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]) { WSADATA wsaData; WORD sockVersion = MAKEWORD(2,2);if(WSAStartup(sockVersion, &wsaData) != 0) {return 0; } SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(serSocket == INVALID_SOCKET) { printf("socket error !");return 0; } sockaddr_in serAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(8888); serAddr.sin_addr.S_un.S_addr = INADDR_ANY;if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) { printf("bind error !"); closesocket(serSocket);return 0; } sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr); while (true) {char recvData[255]; int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);if (ret > 0) { recvData[ret] = 0x00; printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); printf(recvData); }char * sendData = "一个来自服务端的UDP数据包\n"; sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen); } closesocket(serSocket); WSACleanup();return 0; } |
C++ Code
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 | | #include "stdafx.h"#include #include #pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]) { WORD socketVersion = MAKEWORD(2,2); WSADATA wsaData; if(WSAStartup(socketVersion, &wsaData) != 0) {return 0; } SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(8888); sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");int len = sizeof(sin);char * sendData = "来自客户端的数据包.\n"; sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);char recvData[255]; int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);if(ret > 0) { recvData[ret] = 0x00; printf(recvData); } closesocket(sclient); WSACleanup();return 0; } |
本文来至:http://blog.csdn.net/ssun125/article/details/8525823
socket ['sɒkɪt] 详细X
基本翻译
n. 插座;窝,穴;牙槽
vt. 给…配插座
网络释义
socket: 插座
Socket F: Socket F
Socket 2: Socket 2
socket ['sɒkɪt] socket&type=1详细X
基本翻译
n. 插座;窝,穴;牙槽
vt. 给…配插座
网络释义
socket: 插座
Socket F: Socket F
Socket 2: Socket 2