Win_Sockets_Tcp
2015-12-13 21:36
501 查看
a
Server.cpp
Client.cpp
a
/* struct sockaddr_in { short int sin_family; // 地址族 unsigned short int sin_port; // 端口号 struct in_addr sin_addr; //IP地址 unsigned char sin_zero[8]; //填充0 以保持与struct sockaddr同样大小 }; */ /* struct sockaddr { unsigned short sa_family; ///地址族, AF_xxx char sa_data[14]; // 14 字节的协议地址 }; */
Server.cpp
#include<winsock2.h> #include<stdio.h> #include<string.h> #include<iostream> using std::cout; using std::endl; #define SERVPORT 3333 //----服务器监听端口号 #define BACKLOG 10 //----等待连接队列的最大长度 #pragma comment(lib, "ws2_32.lib") DWORD WINAPI ClientThread(LPVOID Tmp_CinSocket) { SOCKET CinSocket = (SOCKET)Tmp_CinSocket; /*----发送数据----*/ char* str = "Server: Hello Cliend,You've connected! Please send me something then something!\n"; if (send(CinSocket, str, strlen(str), 0) == SOCKET_ERROR) perror("Server:send出错!"); /*----循环接收后处理----*/ puts("Local:\tThe words that've received frome Client's:\n"); while (true) { char revData[255]; int ret = recv(CinSocket, revData, 255, 0); if (ret == SOCKET_ERROR) { perror("Error with sending data!"); break; } else if (ret == 0) { cout << "Local:\tClient've ended!\n" << endl; break; } else if (ret > 0) { revData[ret] = 0x00; printf(revData); } } return 0; } int main() { /*----初始化WSA----*/ WSADATA wsaData; //----wsaData用来存储系统传回的关于WINSOCK的资料. if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //----MAKEWORD(2,2)表示使用WINSOCK2版本. { //----MAKEWORD创建一个无符号16位整形,通过连接两个给定的无符号参数 printf("初始化WSA,出错!"); exit(1); } //cout << "IP包最大长度是: " << wsaData.iMaxSockets << std::endl; /*----创建服务器Socket----*/ SOCKET ListenSocket; if ((ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { printf("socket创建出错!"); exit(1); } /*----绑定IP和端口----*/ struct sockaddr_in my_addr; //----本机地址信息 my_addr.sin_family = AF_INET; //----TCP协议族 my_addr.sin_port = htons(SERVPORT); //----端口号 my_addr.sin_addr.s_addr = INADDR_ANY; //----IP地址.设置. memset(my_addr.sin_zero, NULL, 8); //----string.h中的字符cp置空函数 if (bind(ListenSocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR) //----也可以!=0即失败 { perror("bind出错!"); exit(1); } /*----设置监听,最大连接数----*/ if (listen(ListenSocket, BACKLOG) == SOCKET_ERROR) //----也可以!=0或==-1表示失败 { perror("listen出错!"); exit(1); } cout << "服务端开始监听!" << std::endl; /*----循环处理连接----*/ struct sockaddr_in CinAdress; //----接收到的地址 int CinAdressLength = sizeof(CinAdress); //----存储接收到的地址长度(Bytes) SOCKET CinSocket; //----接收到的socket while (true) { /*----轮询方式,接受完一个开线程处理,并继续调用accept函数等待(若无等到阻塞主线程,到新连接触发继续)----*/ CinSocket = accept(ListenSocket, (struct sockaddr *)&CinAdress, &CinAdressLength); //----接受到的,CinAdressLength <= sizeof(struct sockaddr_in), if (CinSocket == INVALID_SOCKET) { perror("accept出错"); continue; } printf("Local:\treceived a connection from \n\t%s:%d\n", inet_ntoa(CinAdress.sin_addr), CinAdress.sin_port); HANDLE hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CinSocket, 0, NULL); if (hThread == NULL) { cout << "Create Thread Failed!" << endl; break; } CloseHandle(hThread); } closesocket(ListenSocket); closesocket(CinSocket); WSACleanup(); return 0; }
Client.cpp
#include <WINSOCK2.H> #include <STDIO.H> #include<string.h> #include<iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") #define Server_Port 3333 #define Server_Address "123.124.2.103" int main(int argc, char* argv[]) { WORD sockVersion = MAKEWORD(2,2); WSADATA data; if(WSAStartup(sockVersion, &data) != 0) { printf("WSA Start Error!"); } SOCKET ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(ClientSocket == INVALID_SOCKET) { printf("invalid ClientSocket !"); return -1; } sockaddr_in ServerAddress; ServerAddress.sin_family = AF_INET; ServerAddress.sin_port = htons(Server_Port); ServerAddress.sin_addr.S_un.S_addr = inet_addr(Server_Address); if (connect(ClientSocket, (sockaddr *)&ServerAddress, sizeof(ServerAddress)) == SOCKET_ERROR) { printf("connect Server error !"); closesocket(ClientSocket); return -1; } char recData[255]; int ret = recv(ClientSocket, recData, 255, 0); if(ret > 0) { //recData[ret] = 0x00; printf(recData); } char sendData[255] = "Client:\tHello,Server!\n"; cout<<"Local:\tPlease cin something by someting,with ending of begin next line with # \n"; while(sendData[0]!='#') { sendData[strlen(sendData)]=NULL; send(ClientSocket, sendData, strlen(sendData), 0); cin.getline(sendData,255); } closesocket(ClientSocket); WSACleanup(); return 0; }
a
相关文章推荐
- 神经网络-overfitting(二)
- 神经网络-overfitting(一)
- TCP/IP详解-协议
- HTTP文件协议介绍
- 黑马程序员之网络编程
- vmware中的3种网络模式:桥接、NAT(地址转换)、host-only
- nova http 409 虚拟机状态重置
- TCP/IP详解卷1 读书笔记:第二十八章 SMTP和POP3协议
- tomcat配置https
- HttpUrlConnection
- 利用Socket建立网络连接的步骤
- NFS网络文件系统的应用
- 什么是TCP连接的三次握手
- HttpServletRequest和HttpServletResponse
- HttpServlet cannot be resolved to a type
- TCP/IP详解卷1 读书笔记:第二十七章 FTP协议
- TCP/IP网络协议
- Android--Apache HttpClient
- Android--HTTP协议
- Firefox 的页面缩放选项在这里 - Http Tool 插件查看自动格式化后的 json