WINSOCK2 TCP client 和server

来源:互联网 发布:android 打开数据连接 编辑:程序博客网 时间:2024/05/01 20:34

这部分真是老麻烦了

代码参考自:http://www.cnblogs.com/haoyuanyuan/p/3268351.html

                       https://wenku.baidu.com/view/4a1eb24dad51f01dc381f108.html

                      http://www.jizhuomi.com/software/398.html

http://blog.csdn.net/shenjie12345678/article/details/28321969

//tcp server
#define _WINSOCK_DEPRECATED_NO_WARNINGS#define _CRT_SECURE_NO_WARNINGS#include <winsock2.h>#include <stdio.h>#pragma comment(lib,"ws2_32")   //显式地加载 静态库int main(int argc, char* argv[]){printf("---------\n| 服务端 |\n-----------");//----------1、加载动态链接库Winsock Dll---------WORD wVersionRequested = MAKEWORD(2, 2);   //WSAStartup函数的参数,指定需要使用的WinSock版本,MAKEWORD(x,y)宏定义将两个字节组装成一个WORDWSADATA wsaData;                           //WSAStartup函数的参数if (WSAStartup(wVersionRequested, &wsaData) != 0)  // 初始化Winsock,装入Winsock.dll,数据传入wsaData,初始化成功返回0,否则返回SOCKET_ERROR{printf("WSAStartup Failed \n");printf("WSAStartup Error = %d \n", WSAGetLastError());}else{printf("加载WinSocket成功 \n");printf("调用者希望使用的WinSocket版本号=%x\n", wsaData.wVersion);printf("加载的WinSock库支持最高WinSock版本号=%x \n", wsaData.wHighVersion);printf("wWinSock库的说明字符串=%s \n", &wsaData.szDescription[0]);printf("系统状态或配置信息的说明字符串=%s\n", &wsaData.szSystemStatus[0]);}//----------2、创建监听的流式套接口----------SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//成功时返回socket ID,失败返回 INVALID_SOCKET  SOCKET 就是UINT_PTR 别名//AF_INET 地址族,使用IP(Internet procotl)协议;SOCK_STREAM 使用TCP,最后一个参数指定协议,6是TCP ,17UDPif (s == INVALID_SOCKET){printf("| Failed socket\n");printf("| Socket Error = %d\n", WSAGetLastError()); //WSAGetLaseError()返回错误号码(int型):}elseprintf("创建用于监听的套接口,套接口号:[%u]\n", s); //%u 是 unsigned int 格式  有符号不满足端口号数目//----3、绑定使用bind()struct sockaddr_in Sadd; //描述本机的端口和IP地址;Sadd.sin_family = AF_INET;Sadd.sin_port = htons(5555);//字节序转换函数,把给定系统所采用的字节序称为主机字节序;为了避免不同主机之间的交换数据时对字节序解释不同而导致错误Sadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//地址转换函数,返回 32 位地址;if (bind(s, (sockaddr*)&Sadd, sizeof(Sadd)) == SOCKET_ERROR) // int status = bind(sock_id,(struct sockaddr_in*)my_addr,sizeof(my_addr)),如果错误返回SOCKET_ERROR{printf("Failed bind()\n");printf("Bind Error = %d\n", WSAGetLastError());}else{printf("绑定成功\n");printf("本地Ip地址:[%s],本地端口号:[%u]\n", inet_ntoa(Sadd.sin_addr), ntohs(Sadd.sin_port));}//---------------④监听状态-------------if (listen(s, 2) == SOCKET_ERROR)  //int status = listen(socket_id,3) 3指定了正在等待连接的最大队列长度{printf("Failed listen()\n");printf("listen Error=%d\n", WSAGetLastError());}//----------------⑤循环接受客户的连接请求---------------------------struct sockaddr_in Cadd;int caddLen = sizeof(Cadd);SOCKET c;while (TRUE){printf("|----------------------------\n");printf("|进入监听状态.....\n|--------------------------------|\n");c = accept(s, (sockaddr*)& Cadd, &caddLen); // SOCKET child_sock = accept(socket_id,(struct sockaddr_in*)client_addr,sizeof(child_addr));if error 返回INVALID_SOCKETif (c == INVALID_SOCKET){printf("|Failed accept()\n");printf("|accept Error=%d\n", WSAGetLastError());}elseprintf("|可以在套接口[%u]上发送接收数据了!\n", c);//#########################开始发送、接收###################### 注意都要在新套接口c上进行//#########################结束发送、接收######################closesocket(c);printf("|与主机IP地址是:[%s]\n|端口号是:[%u]的连接完毕\n", inet_ntoa(Cadd.sin_addr), ntohs(Cadd.sin_port));char xx;printf("|-------------------------------------\n需要退出吗?(Y\n)");scanf("%c", &xx);if (xx == 'Y' || xx == 'y'){break;}}closesocket(s);WSACleanup(); //closesocket();结束之前,调用WSACleanup()return 0;}

+++++++++++++++++++++++++++delimter++++++++++++++++++++++++++++

//tcp client #define _WINSOCK_DEPRECATED_NO_WARNINGS   //下面有旧的被废弃的接口。#define _CRT_SECURE_NO_WARNINGS#include < WINSOCK2.H> #pragma comment( lib, "ws2_32" ) //显示告诉编译器链接ws2_32.lib和设置依赖项效果相同#include < stdio.h> int main(){printf("------------------------\n| 客户端 |\n|---------------------------------------\n");//------①加载动态链接库winsock DLL-----------printf("|加载等待中.... ");WSADATA wsaData;WORD wVersionRequested = MAKEWORD(2, 2);if (WSAStartup(wVersionRequested, &wsaData) != 0) //在载入dll前,任何winsock函数都会返回SOCKET_ERROR{printf("|WSAStartup Failed\n");printf("|WSAStartup Error=%d\n", WSAGetLastError());}else{printf("加载Winsock 库成功 |\n");}printf("|---------------------------------------\n");//-------②创建用于监听的流式套接口s,使用socket()-----------------SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (s == INVALID_SOCKET){printf("|Failed socket\n");printf("|socket Error=%d\n", WSAGetLastError());}elseprintf("|已创建用于监听的套接口,套接口号:[%u]\n", s);printf("|---------------------------------------\n");//------③本地地址bind(可以不做这部分,如果不绑定,系统将自动分配)--------struct sockaddr_in Cadd;Cadd.sin_family=AF_INET;Cadd.sin_port=htons(4444);Cadd.sin_addr.S_un.S_addr=htonl(INADDR_ANY);if (bind(s,(sockaddr*)&Cadd,sizeof(Cadd))==SOCKET_ERROR){printf("|Failed bind()/n");}//-------填写要连接的服务器地址信息---------struct sockaddr_in Sadd;Sadd.sin_family = AF_INET;Sadd.sin_port = htons(5555);Sadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//--------④将套接口s与远程主机相连--------------if (connect(s, (sockaddr*)& Sadd, sizeof(Sadd)) == INVALID_SOCKET){printf("|Failed connect()\n");printf("|connect Error=%d\n", WSAGetLastError());}else{//####################开始发接数据########################printf("|连接成功,可以开始发送接收数据了!\n");printf("|服务器IP地址:[%s]\n 端口号:[%u]\n", inet_ntoa(Sadd.sin_addr), ntohs(Sadd.sin_port));//####################结束发接数据########################}while (1){printf("--------");}//--------------⑤关闭套接字s,终止对动态链接库的访问----------closesocket(s);printf("|---------------------------------------\n");printf("|连接完毕\n");WSACleanup();return 0;}


原创粉丝点击