【C++】TCP/UDP连接建立
////////////////////////////////////////////////////////// // TCPClient.cpp文件 #include <stdio.h> #include "InitSock.h" CInitSock initSock; // 初始化Winsock库 #include <WS2tcpip.h> int main() { // 创建套节字 SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET) { printf(" Failed socket() \n"); return 0; } // 也可以在这里调用bind函数绑定一个本地地址 // 否则系统将会自动安排 // 填写远程地址信息 sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(4567); // 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址 // 如果你的计算机没有联网,直接使用127.0.0.1即可 const char src[] = "127.0.0.1"; in_addr st; inet_pton(AF_INET, src,(void*)&st); servAddr.sin_addr= st; if (::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1) { printf(" Failed connect() \n"); return 0; } while (true) { // 接收数据 char buff[256]; int nRecv = ::recv(s, buff, 256, 0); if (nRecv > 0) { buff[nRecv] = '\0'; printf(" 接收到数据:%s", buff); } } // 关闭套节字 ::closesocket(s); return 0; }
// TCPServer.cpp文件 #include <WS2tcpip.h> #include "InitSock.h" #include <stdio.h> #include <iostream> CInitSock initSock; // 初始化Winsock库 int main() { // 创建套节字 SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sListen == INVALID_SOCKET) { printf("Failed socket() \n"); return 0; } // 填充sockaddr_in结构 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(4567); sin.sin_addr.S_un.S_addr = INADDR_ANY; // 绑定这个套节字到一个本地地址 if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("Failed bind() \n"); return 0; } // 进入监听模式 if (::listen(sListen, 2) == SOCKET_ERROR) { printf("Failed listen() \n"); return 0; } // 循环接受客户的连接请求 sockaddr_in remoteAddr; int nAddrLen = sizeof(remoteAddr); SOCKET sClient; char szText[] = " TCP Server Demo! \r\n"; while (TRUE) { // 接受一个新连接 sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); if (sClient == INVALID_SOCKET) { printf("Failed accept()"); continue; } char IPdotdec[20]; inet_ntop(AF_INET, (void*)&(remoteAddr.sin_addr), IPdotdec,15); printf(" 接受到一个连接:%s \r\n", IPdotdec); while (true) { char szText[100]; std::cin >> szText; ::send(sClient, szText, strlen(szText), 0); } ::closesocket(sClient); } // 关闭监听套节字 ::closesocket(sListen); return 0; }
////////////////////////////////////////////////////////// // UDPClient文件 #include "InitSock.h" #include <stdio.h> CInitSock initSock; // 初始化Winsock库 int main() { // 创建套节字 SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == INVALID_SOCKET) { printf("Failed socket() %d \n", ::WSAGetLastError()); return 0; } // 也可以在这里调用bind函数绑定一个本地地址 // 否则系统将会自动安排 // 填写远程地址信息 sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(4567); // 注意,这里要填写服务器程序所在机器的IP地址 // 如果你的计算机没有联网,直接使用127.0.0.1即可 char IPdotdec[] = "127.0.0.1"; inet_pton(AF_INET, IPdotdec, (void*)&(addr.sin_addr)); // 发送数据 char szText[100]; while (true) { cin >> szText; ::sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr)); } ::closesocket(s); return 0; }
////////////////////////////////////////////////////////// // UDPServer.cpp文件 #include "InitSock.h" #include <stdio.h> CInitSock initSock; // 初始化Winsock库 int main() { // 创建套节字 SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == INVALID_SOCKET) { printf("Failed socket() \n"); return 0; } // 填充sockaddr_in结构 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(4567); sin.sin_addr.S_un.S_addr = INADDR_ANY; // 绑定这个套节字到一个本地地址 if (::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("Failed bind() \n"); return 0; } // 接收数据 char buff[1024]; sockaddr_in addr; int nLen = sizeof(addr); while (TRUE) { int nRecv = ::recvfrom(s, buff, 1024, 0, (sockaddr*)&addr, &nLen); char IPdotdec[20]; inet_ntop(AF_INET, (void*)&(addr.sin_addr), IPdotdec,16); if (nRecv > 0) { buff[nRecv] = '\0'; printf(" 接收到数据(%s):%s", IPdotdec, buff); } else break; } ::closesocket(s); }