简单的TCP编程
//Sever #include "stdafx.h" #include<WinSock2.h> #include<windows.h> #include<iostream> using namespace std; #pragma comment (lib,"ws2_32.lib") #define PORT 6000 DWORD WINAPI clientProc(LPVOID lparam) { //为客户端服务 SOCKET sockClient = (SOCKET)lparam; CHAR szbuf[1024]; while (TRUE) { memset(szbuf, 0, 1024); int ret = recv(sockClient, szbuf, sizeof(szbuf), 0); if (ret== SOCKET_ERROR) { cout << "服务器接受失败" << endl; return -1; } if (ret==0) { cout << "客户端关闭连接" << endl; return -1; } cout << "Sever:" << szbuf << endl; ret = send(sockClient, szbuf, sizeof(szbuf), 0); if (ret==SOCKET_ERROR) { cout << "服务器发送数据失败" << endl; return -1; } } closesocket(sockClient); return 0; } //初始网络环境失败 bool InitNetEnv() { WSADATA wd; if (WSAStartup(MAKEWORD(2, 2), &wd) != 0) { cout << "初始网络环境失败" << endl; return false; } return true; } //TCP Sever int main() { if (!InitNetEnv()) { return -1; } cout << "初始网络环境成功" << endl; //创建套接字 SOCKET sSever = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sSever==INVALID_SOCKET) { cout << "创建套接字失败" << endl; return -1; } cout << "创建套接字成功" << endl; //初始化网络节点 SOCKADDR_IN addrSever; addrSever.sin_family = AF_INET; //IPV4 addrSever.sin_port = htons(PORT); addrSever.sin_addr.S_un.S_addr = INADDR_ANY; //服务器上所有的网卡的IP地址 //进行绑定 int ret = bind(sSever, (sockaddr *)&addrSever, sizeof(sockaddr)); if (ret==SOCKET_ERROR) { cout << "套接字绑定失败" << endl; return -1; } cout << "套接字绑定成功" << endl; ret=listen(sSever, SOMAXCONN); //进行监听 if (ret == SOCKET_ERROR) { cout << "服务器监听失败" << endl; return -1; } cout << "服务器监听成功" << endl; //监听成功,接受客户端的连接请求 SOCKADDR_IN addrClient; int addrClinetLen = sizeof(SOCKADDR_IN); while (TRUE) { SOCKET *sClient = new SOCKET; //接受连接,accept是阻塞型函数,如果没有客户端连接,会卡在这里 *sClient=accept(sSever,(sockaddr *)&addrClient,&addrClinetLen); if (*sClient==INVALID_SOCKET) { cout << "接受客户端请求失败" << endl; WSACleanup(); closesocket(sSever); return -1; } cout << "接受客户端请求成功" << endl; //为客户端创建线程处理 CreateThread(NULL, 0, clientProc,(LPVOID)*sClient, NULL, NULL); Sleep(10); } closesocket(sSever); WSACleanup(); return 0; } //Client #include "stdafx.h" #include<WinSock2.h> #include<windows.h> #include<iostream> using namespace std; #pragma comment (lib,"ws2_32.lib") #define PORT 6000 //TCP Client //初始化网络环境 bool InitNetEnv() { WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa)!=0) { cout << "初始化网络环境失败" << endl; return false; } return true; } int main() { if (!InitNetEnv()) { return -1; } //创建一个套接字socket SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sClient==INVALID_SOCKET) { cout << "创建套接字失败" << endl; WSACleanup(); return -1; } //初始化网络节点 SOCKADDR_IN si; si.sin_family = AF_INET; si.sin_port = htons(PORT); si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //连接 int ret = connect(sClient, (sockaddr *)&si, sizeof(sockaddr)); if (ret==SOCKET_ERROR) { cout << "网络连接失败"<<endl; WSACleanup(); closesocket(sClient); return -1; } char szbuf[2048]; memset(szbuf, 0, sizeof(szbuf)); sprintf_s(szbuf,2048, "hello my first socket Sever"); //向服务器发送消息 ret = send(sClient, szbuf, strlen(szbuf), 0); if (ret == SOCKET_ERROR) { cout << "客户端发送失败" << endl; WSACleanup(); closesocket(sClient); return -1; } //接受从服务器发回来的消息 ret = recv(sClient, szbuf, sizeof(szbuf), 0); if (ret == SOCKET_ERROR) { cout << "客户端接收失败" << endl; WSACleanup(); closesocket(sClient); return -1; } cout << "client:" << szbuf << endl; //关闭套接字,释放网络环境 closesocket(sClient); WSACleanup(); return 0; }