Socket代码小例子——C++版
2016-03-06 20:49
543 查看
服务器端:
客户端:
源自《WIndows网络编程》
// HelloWorld2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #define BUF_SIZE 64 int main(int argc, _TCHAR* argv[]) { WSADATA wsd; //WSADATA变量, 用于初始化Windows Sockets SOCKET sServer; //服务器Socket,用于监听客户端请求 SOCKET sClient; //客户端Socket,用于实现与客户端通信 int retVal; //调用各种Socket函数返回值 char buf[BUF_SIZE]; //用于接收客户端数据的缓冲区 //初始化Winsock2.2 WORD sockVersion = MAKEWORD(2, 2); if (WSAStartup(sockVersion, &wsd) != 0) { printf("WSAStartup 无法初始化!"); return 1; } //显示wsaData中的数据 printf("Version: %d.%d\n", LOBYTE(wsd.wVersion), HIBYTE(wsd.wVersion)); printf("High Version: %d.%d\n", LOBYTE(wsd.wHighVersion), HIBYTE(wsd.wHighVersion)); printf("Description: %s\n", wsd.szDescription); printf("System Status: %s\n", wsd.szSystemStatus); //创建TCP Socket sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sServer == INVALID_SOCKET) { printf("socket error!"); } //定义服务器地址 struct sockaddr_in addr; addr.sin_family = AF_INET; //地址家族 addr.sin_port = htons(9990); //端口 addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //地址 //绑定到Socket retVal = bind(sServer, (SOCKADDR*)&addr, sizeof(struct sockaddr_in)); if (retVal == SOCKET_ERROR) { printf("bind error!\n"); closesocket(sServer); WSACleanup(); return 1; } //监听 retVal = listen(sServer, 1); if (retVal == SOCKET_ERROR) { printf("listen error!\n"); closesocket(sServer); WSACleanup(); return 1; } printf("TCPSocket Server start...\n"); sockaddr_in addrClient; //客户端地址 int addrClientlen = sizeof(addrClient); sClient = accept(sServer, (sockaddr FAR*)&addrClient, &addrClientlen); if (sClient == INVALID_SOCKET) { printf("accept error!\n"); closesocket(sServer); WSACleanup(); return 1; } while (true) { ZeroMemory(buf, BUF_SIZE); retVal = recv(sClient, buf, BUFSIZ, 0); if (SOCKET_ERROR == retVal) { printf("recv error!\n"); closesocket(sServer); closesocket(sClient); WSACleanup(); return -1; } //获取当前系统时间 SYSTEMTIME st; GetLocalTime(&st); char sDateTime[30]; sprintf_s(sDateTime, "%4d-%2d-%2d %2d:%2d:%2d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); //printf("%s, Rev From Client [%s:%d] :%s\n", sDateTime, inet_ntoa(addrClient.sin_addr), addrClient.sin_port, buf); printf("%s, Rev From Client [%d] :%s\n", sDateTime, addrClient.sin_port, buf); //如果客户端发送“quit”字符串,则服务器退出 if (strcmp(buf, "quit") == 0) { retVal = send(sClient, "quit", strlen("quit"), 0); break; } //否则向客户端发送回显字符串 else { char msg[BUF_SIZE]; sprintf_s(msg, "Message received - %s", buf); retVal = send(sClient, msg, strlen(msg), 0); if (SOCKET_ERROR == retVal) { printf("send error!\n"); closesocket(sServer); closesocket(sClient); WSACleanup(); return -1; } } } closesocket(sServer); closesocket(sClient); //最后做一些清理工作 if (WSACleanup() == SOCKET_ERROR) { printf("WSACleanup 出错!"); } system("pause"); return 0; }
客户端:
// TcpSocketClient.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <string> #include <iostream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #define BUF_SIZE 64 int main(int argc, _TCHAR* argv[]) { WSADATA wsd; //WSADATA变量, 用于初始化Windows Sockets SOCKET sHort; //与服务器通信的Sockets SOCKADDR_IN servAddr; //服务器地址 int retVal; //调用各种Socket函数返回值 char buf[BUF_SIZE]; //用于接收客户端数据的缓冲区 //初始化Winsock2.2 WORD sockVersion = MAKEWORD(2, 2); if (WSAStartup(sockVersion, &wsd) != 0) { printf("WSAStartup 无法初始化!"); return -1; } //显示wsaData中的数据 printf("Version: %d.%d\n", LOBYTE(wsd.wVersion), HIBYTE(wsd.wVersion)); printf("High Version: %d.%d\n", LOBYTE(wsd.wHighVersion), HIBYTE(wsd.wHighVersion)); printf("Description: %s\n", wsd.szDescription); printf("System Status: %s\n", wsd.szSystemStatus); //创建TCP Socket sHort = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sHort == INVALID_SOCKET) { printf("socket error!\n"); WSACleanup(); return -1; } //定义服务器地址 servAddr.sin_family = AF_INET; //地址家族 servAddr.sin_port = htons(9990); //端口 servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.102"); //地址http://jingyan.baidu.com/article/1709ad8097e5904634c4f03e.html int sServerAddlen = sizeof(servAddr); //计算地址的长度 //连接服务器 retVal = connect(sHort, (LPSOCKADDR)&servAddr, sizeof(servAddr)); if (retVal == SOCKET_ERROR) { printf("connect error!\n"); closesocket(sHort); WSACleanup(); return -1; } while (true) { //向服务器发送数据 printf("Please input a string to send: "); std::string str; //接收输入的数据 std::getline(std::cin, str); //将用户输入的数据复制到buf中 ZeroMemory(buf, BUF_SIZE); strcpy(buf, str.c_str()); //向服务器发数据 retVal = send(sHort, buf, strlen(buf), 0); if (SOCKET_ERROR == retVal) { printf("send error!\n"); closesocket(sHort);; WSACleanup(); return -1; } //接收服务器回传数据 retVal = recv(sHort, buf, strlen(buf)+1, 0); printf("Recv Form Server: %s\n", buf); if (strcmp(buf, "quit") == 0) { printf("quit!\n"); break; } } closesocket(sHort); //最后做一些清理工作 if (WSACleanup() == SOCKET_ERROR) { printf("WSACleanup 出错!"); } system("pause"); return 0; }
源自《WIndows网络编程》
相关文章推荐
- c++中重载,重写,重定义的区别
- 背包
- 个人项目-数组求和(语言:C++)
- 静态库与动态库及交叉编译总结及学习较底层编程:动手写一个C语言编译器
- c语言学习笔记--初识c
- C语言之位运算
- C语言模仿C#事件
- PAT (Advanced Level) Practice 1006
- 九度-简单题 题目1065:输出梯形
- C++中的类所占内存空间总结
- hello c world
- VS2010读写EXCEL07遇到的错误处理
- 、给一组字符串,需要你输出最小长度的字符串与最大长度的字符串,如果有相同最小(大)长度的,就按照给的顺序挨个输出。
- C++ STL泛型编程
- 学习C++反汇编-菱形继承
- C语言中#define的用法(转)
- C++ list的基本操作和使用
- 简易C/C++日志代码实现
- 基本排序算法总结(C/C++)
- 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码